Skip to content

Commit

Permalink
Extraigo los tests de indicadores a un archivo separado
Browse files Browse the repository at this point in the history
  • Loading branch information
lrromero committed Jun 26, 2018
1 parent b6414c3 commit e26620d
Show file tree
Hide file tree
Showing 16 changed files with 47,632 additions and 368 deletions.
15,739 changes: 15,739 additions & 0 deletions tests/cassetes/indicators/test_bad_date_indicators.yaml

Large diffs are not rendered by default.

15,739 changes: 15,739 additions & 0 deletions tests/cassetes/indicators/test_bad_summary.yaml

Large diffs are not rendered by default.

File renamed without changes.
File renamed without changes.
File renamed without changes.
15,739 changes: 15,739 additions & 0 deletions tests/cassetes/indicators/test_valid_and_unreachable_catalogs.yaml

Large diffs are not rendered by default.

368 changes: 0 additions & 368 deletions tests/test_core.py
Original file line number Diff line number Diff line change
Expand Up @@ -593,374 +593,6 @@ def test_generate_catalog_readme(self):

assert_true(comparison)

@my_vcr.use_cassette()
def test_generate_catalog_indicators(self):
catalog = os.path.join(self.SAMPLES_DIR, "several_datasets.json")

indicators = self.dj.generate_catalogs_indicators(catalog)[0][0]

# Resultados esperados haciendo cuentas manuales sobre el catálogo
expected = {
'datasets_cant': 3,
'distribuciones_cant': 6,
'datasets_meta_ok_cant': 2,
'datasets_meta_error_cant': 1,
'datasets_meta_ok_pct': round(100 * float(2) / 3, 2),
}

for k, v in expected.items():
assert_true(indicators[k], v)

@my_vcr.use_cassette()
def test_date_indicators(self):
from datetime import datetime
catalog = os.path.join(self.SAMPLES_DIR, "several_datasets.json")

indicators = self.dj.generate_catalogs_indicators(catalog)[0][0]
dias_diff = (datetime.now() - datetime(2016, 4, 14)).days

expected = {
'catalogo_ultima_actualizacion_dias': dias_diff,
'datasets_actualizados_cant': 1,
'datasets_desactualizados_cant': 2,
'datasets_actualizados_pct': 100 * round(float(1) / 3, 2),
'datasets_frecuencia_cant': {
'R/P1W': 1,
'R/P1M': 1,
'eventual': 1
},
}

for k, v in expected.items():
assert_equal(indicators[k], v)

@my_vcr.use_cassette()
def test_format_indicators(self):
catalog = os.path.join(self.SAMPLES_DIR, "several_datasets.json")

indicators = self.dj.generate_catalogs_indicators(catalog)[0][0]

expected = {
'distribuciones_formatos_cant': {
'CSV': 1,
'XLSX': 1,
'PDF': 1
}
}

for k, v in expected.items():
assert_equal(indicators[k], v)

@my_vcr.use_cassette()
def test_field_indicators_on_min_catalog(self):
catalog = os.path.join(self.SAMPLES_DIR, "minimum_data.json")

# Se espera un único catálogo como resultado, índice 0
indicators = self.dj.generate_catalogs_indicators(catalog)[0][0]

expected = {
'campos_recomendados_pct': 0.0,
'campos_optativos_pct': 0.0,
}

for k, v in expected.items():
assert_equal(indicators[k], v)

@my_vcr.use_cassette()
def test_field_indicators_on_full_catalog(self):
catalog = os.path.join(self.SAMPLES_DIR, "full_data.json")

# Se espera un único catálogo como resultado, índice 0
indicators = self.dj.generate_catalogs_indicators(catalog)[0][0]

expected = {
'campos_recomendados_pct': 95.45,
'campos_optativos_pct': 100
}

for k, v in expected.items():
assert_equal(indicators[k], v)

@my_vcr.use_cassette()
def test_federation_indicators_same_catalog(self):
catalog = os.path.join(self.SAMPLES_DIR, "several_datasets.json")

indicators = self.dj.generate_catalogs_indicators(catalog, catalog)[1]

# Esperado: todos los datasets están federados
expected = {
'datasets_federados_cant': 3,
'datasets_no_federados_cant': 0,
'datasets_no_federados': [],
'datasets_federados_pct': 100
}

for k, v in expected.items():
assert_equal(indicators[k], v)

@my_vcr.use_cassette()
def test_federation_indicators_no_datasets(self):
catalog = os.path.join(self.SAMPLES_DIR, "several_datasets.json")
central = os.path.join(self.SAMPLES_DIR, "catalogo_justicia.json")
indicators = self.dj.generate_catalogs_indicators(catalog, central)[1]

# Esperado: ningún dataset está federado
expected = {
'datasets_federados_cant': 0,
'datasets_no_federados_cant': 3,
'datasets_no_federados': [
('Sistema de contrataciones electrónicas UNO', None),
('Sistema de contrataciones electrónicas DOS', None),
('Sistema de contrataciones electrónicas TRES', None)],
'datasets_federados_pct': 0
}

for k, v in expected.items():
assert_equal(indicators[k], v)

@my_vcr.use_cassette()
def test_federation_indicators_removed_datasets(self):

# CASO 1
# se buscan los datasets federados en el central que fueron eliminados
# en el específico pero no se encuentran porque el publisher.name no
# tiene publicado ningún otro dataset en el catálogo específico
catalog = os.path.join(
self.SAMPLES_DIR, "catalogo_justicia_removed.json"
)
central = os.path.join(self.SAMPLES_DIR, "catalogo_justicia.json")
indicators = self.dj.generate_catalogs_indicators(catalog, central)[1]

# Esperado: no se encuentra el dataset removido, porque el
# publisher.name no existe en ningún otro dataset
expected = {
"datasets_federados_eliminados_cant": 0,
"datasets_federados_eliminados": []
}

for k, v in expected.items():
assert_equal(indicators[k], v)

# CASO 2
# se buscan los datasets federados en el central que fueron eliminados
# en el específico y se encuentran porque el publisher.name tiene
# publicado otro dataset en el catálogo específico
catalog = os.path.join(
self.SAMPLES_DIR, "catalogo_justicia_removed_publisher.json"
)
indicators = self.dj.generate_catalogs_indicators(catalog, central)[1]
# Esperado: no se encuentra el dataset removido, porque el
# publisher.name no existe en ningún otro dataset
expected = {
"datasets_federados_eliminados_cant": 1,
"datasets_federados_eliminados": [(
'Base de datos legislativos Infoleg',
"http://datos.jus.gob.ar/dataset/base-de-datos-legislativos-infoleg"
)]
}

for k, v in expected.items():
assert_equal(indicators[k], v)

@my_vcr.use_cassette()
def test_network_indicators(self):
one_catalog = os.path.join(self.SAMPLES_DIR, "several_datasets.json")
other_catalog = os.path.join(self.SAMPLES_DIR, "full_data.json")

indicators, network_indicators = self.dj.generate_catalogs_indicators([
one_catalog,
other_catalog
])

# Esperado: suma de los indicadores individuales
# No se testean los indicadores de actualización porque las fechas no
# se mantienen actualizadas
expected = {
'catalogos_cant': 2,
'datasets_cant': 5,
'distribuciones_cant': 8,
'datasets_meta_ok_cant': 4,
'datasets_meta_error_cant': 1,
'datasets_meta_ok_pct': 100 * float(4) / 5,
'distribuciones_formatos_cant': {
'CSV': 2,
'XLSX': 1,
'PDF': 2
},
'campos_optativos_pct': 33.33,
'campos_recomendados_pct': 50.72,
}

for k, v in expected.items():
assert_equal(network_indicators[k], v)

@my_vcr.use_cassette()
def test_indicators_invalid_periodicity(self):
catalog = os.path.join(self.SAMPLES_DIR,
"malformed_accrualperiodicity.json")

indicators = self.dj.generate_catalogs_indicators(catalog)[0][0]

# Periodicidad inválida se considera automáticamente como
# catálogo desactualizado
expected = {
'datasets_actualizados_cant': 0,
'datasets_desactualizados_cant': 1,
'datasets_actualizados_pct': 0
}

for k, v in expected.items():
assert_equal(indicators[k], v, k)

@my_vcr.use_cassette()
def test_indicators_missing_periodicity(self):
catalog = os.path.join(self.SAMPLES_DIR, "missing_periodicity.json")

# Dataset con periodicidad faltante no aporta valores para indicadores
# de tipo 'datasets_(des)actualizados'
indicators = self.dj.generate_catalogs_indicators(catalog)[0][0]
expected = {
'datasets_actualizados_cant': 0,
'datasets_desactualizados_cant': 0,
'datasets_actualizados_pct': 0
}

for k, v in expected.items():
assert_equal(indicators[k], v, k)

@my_vcr.use_cassette()
def test_indicators_missing_dataset(self):
catalog = os.path.join(self.SAMPLES_DIR, "missing_dataset.json")

indicators = self.dj.generate_catalogs_indicators(catalog)[0][0]

# Catálogo sin datasets no aporta indicadores significativos
expected = {
'datasets_cant': 0,
'datasets_meta_ok_cant': 0,
'datasets_meta_error_cant': 0,
'datasets_actualizados_cant': 0,
'datasets_desactualizados_cant': 0,
'datasets_actualizados_pct': 0,
'distribuciones_formatos_cant': {},
'datasets_frecuencia_cant': {}
}

for k, v in expected.items():
assert_equal(indicators[k], v, k)

@my_vcr.use_cassette()
def test_last_updated_indicator_missing_issued_field(self):
from datetime import datetime
catalog = os.path.join(self.SAMPLES_DIR, "minimum_data.json")

indicators = self.dj.generate_catalogs_indicators(catalog)[0][0]
dias_diff = (datetime.now() - datetime(2016, 4, 14)).days

# Catálogo no tiene 'issued', pero su dataset sí -> uso el del dataset
expected = {
'catalogo_ultima_actualizacion_dias': dias_diff
}

for k, v in expected.items():
assert_equal(indicators[k], v, k)

def test_dataset_is_updated(self):
catalog = os.path.join(self.SAMPLES_DIR, "catalogo_justicia.json")

# Datasset con periodicity mensual vencida
dataset = "Base de datos legislativos Infoleg"
assert_false(self.dj.dataset_is_updated(catalog, dataset))

# Dataset con periodicity eventual, siempre True
dataset = "Declaración Jurada Patrimonial Integral de carácter público"
assert_true(self.dj.dataset_is_updated(catalog, dataset))

@my_vcr.use_cassette()
def test_date_network_indicators_empty_catalog(self):
catalog = os.path.join(self.SAMPLES_DIR, "invalid_catalog_empty.json")
indics, network_indics = self.dj.generate_catalogs_indicators(
[catalog,
catalog]
)

for k, v in network_indics.items():
assert_true(v is not None)

def test_unreachable_catalogs(self):
catalog = os.path.join(self.SAMPLES_DIR, "invalid/path.json")
indics, network_indics = self.dj.generate_catalogs_indicators(
[catalog,
catalog]
)
assert_equal([], indics)
assert_equal({}, network_indics)

def test_valid_and_unreachable_catalogs(self):
valid = os.path.join(self.SAMPLES_DIR, "several_datasets.json")
unreachable = os.path.join(self.SAMPLES_DIR, "invalid/path.json")

indicators = self.dj.generate_catalogs_indicators([valid, unreachable])[0][0]

# El resultado ignora el catálogo inaccesible
expected = {
'datasets_cant': 3,
'distribuciones_cant': 6,
'datasets_meta_ok_cant': 2,
'datasets_meta_error_cant': 1,
'datasets_meta_ok_pct': round(100 * float(2) / 3, 2),
}

for k, v in expected.items():
assert_true(indicators[k], v)

def test_unreachable_central_catalog(self):
catalog = os.path.join(self.SAMPLES_DIR, "several_datasets.json")
unreachable = os.path.join(self.SAMPLES_DIR, "invalid/path.json")
indics = self.dj.generate_catalogs_indicators(catalog, central_catalog=unreachable)[0][0]
expected = {
'datasets_cant': 3,
'distribuciones_cant': 6,
'datasets_meta_ok_cant': 2,
'datasets_meta_error_cant': 1,
'datasets_meta_ok_pct': round(100 * float(2) / 3, 2),
'datasets_federados_cant': None,
'datasets_no_federados_cant': None,
'datasets_no_federados': None,
'datasets_federados_pct': None
}
for k, v in expected.items():
assert_equal(indics[k], v)

@mock.patch('pydatajson.indicators.generate_datasets_summary', autospec=True)
def test_bad_summary(self, mock_summary):
mock_summary.side_effect = Exception('bad summary')
catalog = os.path.join(self.SAMPLES_DIR, "several_datasets.json")
indics = self.dj.generate_catalogs_indicators(catalog)[0][0]
expected = {
'datasets_cant': None,
'distribuciones_cant': None,
'datasets_meta_ok_cant': None,
'datasets_meta_error_cant': None,
'datasets_meta_ok_pct': None
}
for k, v in expected.items():
assert_equal(indics[k], v)

def test_bad_date_indicators(self):
catalog = self.dj
catalog['issued'] = catalog['modified'] = 'invalid_date'
indics = self.dj.generate_catalogs_indicators()[0][0]
expected = {
'datasets_desactualizados_cant': None,
'datasets_actualizados_cant': None,
'datasets_actualizados_pct': None,
'catalogo_ultima_actualizacion_dias': None,
'datasets_frecuencia_cant': None
}
for k, v in expected.items():
assert_equal(indics[k], v)

def test_DataJson_constructor(self):
for key, value in iteritems(self.catalog):
if key != "dataset":
Expand Down

0 comments on commit e26620d

Please sign in to comment.