tests: add check of JSON schema (#29862)

This commit is contained in:
Benjamin Dauvergne 2019-01-18 09:14:14 +01:00
parent fb8ede1a88
commit 9a31c770d5
2 changed files with 379 additions and 1 deletions

369
tests/olap.model Normal file
View File

@ -0,0 +1,369 @@
{
"cubes" : [
{
"dimensions" : [
{
"join" : [
"receipt_time"
],
"label" : "date de la demande",
"name" : "receipt_time",
"type" : "date",
"value" : "receipt_time.date"
},
{
"join" : [
"channel"
],
"label" : "canal",
"name" : "channel",
"type" : "integer",
"value" : "channel.id",
"value_label" : "channel.label"
},
{
"join" : [
"formdef",
"category"
],
"label" : "catégorie",
"name" : "category",
"order_by" : "category.label",
"type" : "integer",
"value" : "category.id",
"value_label" : "category.label"
},
{
"join" : [
"formdef"
],
"label" : "formulaire",
"name" : "formdef",
"order_by" : "formdef.label",
"type" : "integer",
"value" : "formdef.id",
"value_label" : "formdef.label"
},
{
"join" : [
"generic_status"
],
"label" : "statut simplifié",
"name" : "generic_status",
"type" : "integer",
"value" : "generic_status.id",
"value_label" : "generic_status.label"
},
{
"filter" : false,
"join" : [
"hour"
],
"label" : "heure",
"name" : "hour",
"type" : "integer",
"value" : "hour.id"
},
{
"join" : [
"agent"
],
"label" : "premier agent traitant",
"name" : "agent",
"order_by" : "agent.label",
"type" : "integer",
"value" : "agent.id",
"value_label" : "agent.label"
}
],
"fact_table" : "formdata",
"joins" : [
{
"detail" : "date",
"master" : "receipt_time",
"name" : "receipt_time",
"table" : "dates"
},
{
"detail" : "id",
"master" : "channel_id",
"name" : "channel",
"table" : "channel"
},
{
"detail" : "id",
"master" : "formdef_id",
"name" : "formdef",
"table" : "formdef"
},
{
"detail" : "id",
"kind" : "left",
"master" : "formdef.category_id",
"name" : "category",
"table" : "category"
},
{
"detail" : "id",
"master" : "hour_id",
"name" : "hour",
"table" : "hour"
},
{
"detail" : "id",
"master" : "generic_status_id",
"name" : "generic_status",
"table" : "status"
},
{
"detail" : "id",
"kind" : "inner",
"master" : "first_agent_id",
"name" : "agent",
"table" : "agent"
}
],
"json_field" : "json_data",
"key" : "id",
"label" : "Tous les formulaires",
"measures" : [
{
"expression" : "count({fact_table}.id)",
"label" : "nombre de demandes",
"name" : "count",
"type" : "integer"
},
{
"expression" : "avg(endpoint_delay)",
"label" : "délai de traitement moyen",
"name" : "avg_endpoint_delay",
"type" : "duration"
},
{
"expression" : "max(endpoint_delay)",
"label" : "délai de traitement maximum",
"name" : "max_endpoint_delay",
"type" : "duration"
},
{
"expression" : "min(endpoint_delay)",
"label" : "délai de traitement minimum",
"name" : "min_endpoint_delay",
"type" : "duration"
},
{
"expression" : "case (select count({fact_table}.id) from {table_expression} where {where_conditions}) when 0 then null else count({fact_table}.id) * 100. / (select count({fact_table}.id) from {table_expression} where {where_conditions}) end",
"label" : "pourcentage des demandes",
"name" : "percent",
"type" : "percent"
},
{
"expression" : "array_agg(\"{fact_table}\".geolocation_base) FILTER (WHERE \"{fact_table}\".geolocation_base IS NOT NULL)",
"label" : "localisation géographique",
"name" : "geolocation",
"type" : "point"
}
],
"name" : "all_formdata"
},
{
"dimensions" : [
{
"join" : [
"receipt_time"
],
"label" : "date de la demande",
"name" : "receipt_time",
"type" : "date",
"value" : "receipt_time.date"
},
{
"join" : [
"channel"
],
"label" : "canal",
"name" : "channel",
"type" : "integer",
"value" : "channel.id",
"value_label" : "channel.label"
},
{
"join" : [
"generic_status"
],
"label" : "statut simplifié",
"name" : "generic_status",
"type" : "integer",
"value" : "generic_status.id",
"value_label" : "generic_status.label"
},
{
"filter" : false,
"join" : [
"hour"
],
"label" : "heure",
"name" : "hour",
"type" : "integer",
"value" : "hour.id"
},
{
"join" : [
"agent"
],
"label" : "premier agent traitant",
"name" : "agent",
"order_by" : "agent.label",
"type" : "integer",
"value" : "agent.id",
"value_label" : "agent.label"
},
{
"join" : [
"status"
],
"label" : "statut",
"name" : "status",
"type" : "integer",
"value" : "status.id",
"value_label" : "status.label"
},
{
"filter" : false,
"join" : [
"function__receiver"
],
"label" : "fonction recipient",
"name" : "function__receiver",
"type" : "integer",
"value" : "\"function__receiver\".id",
"value_label" : "\"function__receiver\".label"
},
{
"filter" : true,
"join" : [
"field_item"
],
"label" : "2nd field",
"name" : "field_item",
"type" : "integer",
"value" : "\"field_item\".id",
"value_label" : "\"field_item\".label"
}
],
"fact_table" : "formdata_demande",
"joins" : [
{
"detail" : "date",
"master" : "receipt_time",
"name" : "receipt_time",
"table" : "dates"
},
{
"detail" : "id",
"master" : "channel_id",
"name" : "channel",
"table" : "channel"
},
{
"detail" : "id",
"master" : "formdef_id",
"name" : "formdef",
"table" : "formdef"
},
{
"detail" : "id",
"kind" : "left",
"master" : "formdef.category_id",
"name" : "category",
"table" : "category"
},
{
"detail" : "id",
"master" : "hour_id",
"name" : "hour",
"table" : "hour"
},
{
"detail" : "id",
"master" : "generic_status_id",
"name" : "generic_status",
"table" : "status"
},
{
"detail" : "id",
"kind" : "inner",
"master" : "first_agent_id",
"name" : "agent",
"table" : "agent"
},
{
"detail" : "id",
"master" : "status_id",
"name" : "status",
"table" : "status_demande"
},
{
"detail" : "id",
"master" : "function__receiver",
"name" : "function__receiver",
"table" : "role"
},
{
"detail" : "id",
"master" : "field_field_item",
"name" : "field_item",
"table" : "formdata_demande_field_field_item"
}
],
"key" : "id",
"label" : "Demande",
"measures" : [
{
"expression" : "count({fact_table}.id)",
"label" : "nombre de demandes",
"name" : "count",
"type" : "integer"
},
{
"expression" : "avg(endpoint_delay)",
"label" : "délai de traitement moyen",
"name" : "avg_endpoint_delay",
"type" : "duration"
},
{
"expression" : "max(endpoint_delay)",
"label" : "délai de traitement maximum",
"name" : "max_endpoint_delay",
"type" : "duration"
},
{
"expression" : "min(endpoint_delay)",
"label" : "délai de traitement minimum",
"name" : "min_endpoint_delay",
"type" : "duration"
},
{
"expression" : "case (select count({fact_table}.id) from {table_expression} where {where_conditions}) when 0 then null else count({fact_table}.id) * 100. / (select count({fact_table}.id) from {table_expression} where {where_conditions}) end",
"label" : "pourcentage des demandes",
"name" : "percent",
"type" : "percent"
},
{
"expression" : "array_agg(\"{fact_table}\".geolocation_base) FILTER (WHERE \"{fact_table}\".geolocation_base IS NOT NULL)",
"label" : "localisation géographique",
"name" : "geolocation",
"type" : "point"
}
],
"name" : "formdata_demande"
}
],
"label" : "olap",
"name" : "olap",
"pg_dsn" : "dbname=db660834",
"search_path" : [
"olap",
"public"
]
}

View File

@ -1,4 +1,5 @@
import subprocess
import json
import pathlib2
def test_wcs_fixture(wcs, postgres_db, tmpdir, caplog):
@ -82,6 +83,7 @@ schema = olap
('status_demande', 'label')
]
# verify SQL schema
with postgres_db.conn() as conn:
with conn.cursor() as c:
c.execute('SELECT table_name, column_name '
@ -89,3 +91,10 @@ schema = olap
'WHERE table_schema = \'olap\' ORDER BY table_name, ordinal_position')
assert list(c.fetchall()) == expected_schema
# verify JSON schema
with (model_dir / 'olap.model').open() as fd, (pathlib2.Path(__file__).parent / 'olap.model').open() as fd2:
json_schema = json.load(fd)
expected_json_schema = json.load(fd2)
expected_json_schema['pg_dsn'] = postgres_db.dsn
assert json_schema == expected_json_schema