def test_generate_version_for_objecttype_with_existed_version(self): object_type = ObjectTypeFactory.create() ObjectVersionFactory.create(object_type=object_type, version=1) object_version = ObjectVersion.objects.create( json_schema=JSON_SCHEMA, object_type=object_type ) self.assertEqual(object_version.version, 2)
def test_update_draft_save_button(self): object_type = ObjectTypeFactory.create() ObjectVersionFactory.create(object_type=object_type, status=ObjectVersionStatus.draft) url = reverse("admin:core_objecttype_change", args=[object_type.id]) get_response = self.app.get(url) save_button = get_response.html.find("input", {"name": "_save"}) self.assertIsNotNone(save_button)
def test_new_version_draft_no_button(self): object_type = ObjectTypeFactory.create() ObjectVersionFactory.create(object_type=object_type) url = reverse("admin:core_objecttype_change", args=[object_type.id]) get_response = self.app.get(url) new_version_button = get_response.html.find("input", {"name": "_newversion"}) self.assertIsNone(new_version_button)
def test_publish_published_no_button(self): object_type = ObjectTypeFactory.create() ObjectVersionFactory.create(object_type=object_type, status=ObjectVersionStatus.published) url = reverse("admin:core_objecttype_change", args=[object_type.id]) get_response = self.app.get(url) publish_button = get_response.html.find("input", {"name": "_publish"}) self.assertIsNone(publish_button)
def test_display_only_last_version(self): object_type = ObjectTypeFactory.create() ObjectVersionFactory.create_batch(3, object_type=object_type) url = reverse("admin:core_objecttype_change", args=[object_type.id]) get_response = self.app.get(url) form = get_response.form self.assertEqual(int(form["versions-TOTAL_FORMS"].value), 1) self.assertEqual(int(form["versions-0-id"].value), object_type.last_version.id)
def test_delete_objecttype_with_versions_fail(self): object_type = ObjectTypeFactory.create() ObjectVersionFactory.create(object_type=object_type) url = reverse("objecttype-detail", args=[object_type.uuid]) response = self.client.delete(url) self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST) data = response.json() self.assertEqual( data["non_field_errors"], [ "All related versions should be destroyed before destroying the objecttype" ], )
def test_update_published_version_fail(self): object_type = ObjectTypeFactory.create() object_version = ObjectVersionFactory.create( object_type=object_type, status=ObjectVersionStatus.published) url = reverse("objectversion-detail", args=[object_type.uuid, object_version.version]) new_json_schema = { "type": "object", "title": "Tree", "$schema": "http://json-schema.org/draft-07/schema#", "required": ["diameter"], "properties": { "diameter": { "type": "number" } }, } response = self.client.put(url, {"jsonSchema": new_json_schema}) self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST) data = response.json() self.assertEqual(data["non_field_errors"], ["Only draft versions can be changed"])
def test_update_version(self): object_type = ObjectTypeFactory.create() object_version = ObjectVersionFactory.create(object_type=object_type) url = reverse("objectversion-detail", args=[object_type.uuid, object_version.version]) new_json_schema = { "type": "object", "title": "Tree", "$schema": "http://json-schema.org/draft-07/schema#", "required": ["diameter"], "properties": { "diameter": { "type": "number" } }, } response = self.client.put( url, { "jsonSchema": new_json_schema, "status": ObjectVersionStatus.published }, ) self.assertEqual(response.status_code, status.HTTP_200_OK) object_version.refresh_from_db() self.assertEqual(object_version.json_schema, new_json_schema) self.assertEqual(object_version.status, ObjectVersionStatus.published) self.assertEqual(object_version.published_at, date(2020, 1, 1))
def test_update_draft(self): old_schema = { "type": "object", "title": "Tree", "$schema": "http://json-schema.org/draft-07/schema#", "properties": { "diameter": { "type": "integer", "description": "size in cm." } }, } object_type = ObjectTypeFactory.create() object_version = ObjectVersionFactory.create(object_type=object_type, json_schema=old_schema) url = reverse("admin:core_objecttype_change", args=[object_type.id]) get_response = self.app.get(url) save_button = get_response.html.find("input", {"name": "_save"}) self.assertIsNotNone(save_button) form = get_response.form form["versions-0-json_schema"] = json.dumps(JSON_SCHEMA) response = form.submit() self.assertEqual(response.status_code, 302) object_version.refresh_from_db() self.assertEqual(object_version.json_schema, JSON_SCHEMA)
def test_get_versions(self): object_type = ObjectTypeFactory.create() object_version = ObjectVersionFactory.create(object_type=object_type) url = reverse("objectversion-list", args=[object_type.uuid]) response = self.client.get(url) self.assertEqual(response.status_code, status.HTTP_200_OK) self.assertEqual( response.json(), { "count": 1, "next": None, "previous": None, "results": [{ "url": f"http://testserver{reverse('objectversion-detail', args=[object_type.uuid, object_version.version])}", "version": object_version.version, "objectType": f"http://testserver{reverse('objecttype-detail', args=[object_version.object_type.uuid])}", "status": object_version.status, "createdAt": "2020-01-01", "modifiedAt": "2020-01-01", "publishedAt": None, "jsonSchema": JSON_SCHEMA, }], }, )
def test_new_version_published(self): object_type = ObjectTypeFactory.create() object_version = ObjectVersionFactory.create( object_type=object_type, status=ObjectVersionStatus.published) url = reverse("admin:core_objecttype_change", args=[object_type.id]) get_response = self.app.get(url) new_version_button = get_response.html.find("input", {"name": "_newversion"}) self.assertIsNotNone(new_version_button) form = get_response.form response = form.submit("_newversion") self.assertEqual(response.status_code, 302) object_type.refresh_from_db() self.assertEqual(object_type.versions.count(), 2) last_version = object_type.last_version self.assertNotEqual(last_version, object_version) self.assertEqual(last_version.version, object_version.version + 1) self.assertEqual(last_version.json_schema, object_version.json_schema) self.assertEqual(last_version.status, ObjectVersionStatus.draft)
def test_delete_version(self): object_type = ObjectTypeFactory.create() object_version = ObjectVersionFactory.create(object_type=object_type) url = reverse("objectversion-detail", args=[object_type.uuid, object_version.version]) response = self.client.delete(url) self.assertEqual(response.status_code, status.HTTP_204_NO_CONTENT) self.assertEqual(ObjectVersion.objects.count(), 0)
def test_display_all_versions_in_history(self): object_type = ObjectTypeFactory.create() ObjectVersionFactory.create_batch(3, object_type=object_type) url = reverse("admin:core_objecttype_history", args=[object_type.id]) response = self.app.get(url) object_type = response.context["object"] self.assertEqual(response.status_code, 200) table = response.html.find(id="change-history") table_rows = table.tbody.find_all("tr") self.assertEqual(len(table_rows), 3) for object_version, row in zip(object_type.ordered_versions, table_rows): row_version = row.find("td") self.assertEqual(int(row_version.text), object_version.version)
def test_get_objecttypes(self): object_type = ObjectTypeFactory.create() object_version = ObjectVersionFactory.create(object_type=object_type) url = reverse("objecttype-detail", args=[object_type.uuid]) response = self.client.get(url) self.assertEqual(response.status_code, status.HTTP_200_OK) self.assertEqual( response.json(), { "url": f"http://testserver{url}", "uuid": str(object_type.uuid), "name": object_type.name, "namePlural": object_type.name_plural, "description": object_type.description, "dataClassification": object_type.data_classification, "maintainerOrganization": object_type.maintainer_organization, "maintainerDepartment": object_type.maintainer_department, "contactPerson": object_type.contact_person, "contactEmail": object_type.contact_email, "source": object_type.source, "updateFrequency": object_type.update_frequency, "providerOrganization": object_type.provider_organization, "documentationUrl": object_type.documentation_url, "labels": object_type.labels, "createdAt": "2020-01-01", "modifiedAt": "2020-01-01", "allowGeometry": object_type.allow_geometry, "versions": [ f"http://testserver{reverse('objectversion-detail', args=[object_type.uuid, object_version.version])}" ], }, )
def test_delete_puclished_version_fail(self): object_type = ObjectTypeFactory.create() object_version = ObjectVersionFactory.create( object_type=object_type, status=ObjectVersionStatus.published) url = reverse("objectversion-detail", args=[object_type.uuid, object_version.version]) response = self.client.delete(url) self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST) data = response.json() self.assertEqual(data["non_field_errors"], ["Only draft versions can be destroyed"])
def test_publish_draft(self): object_type = ObjectTypeFactory.create() object_version = ObjectVersionFactory.create(object_type=object_type) url = reverse("admin:core_objecttype_change", args=[object_type.id]) get_response = self.app.get(url) publish_button = get_response.html.find("input", {"name": "_publish"}) self.assertIsNotNone(publish_button) form = get_response.form response = form.submit("_publish") self.assertEqual(response.status_code, 302) object_version.refresh_from_db() self.assertEqual(object_version.status, ObjectVersionStatus.published) self.assertEqual(object_version.published_at, date.today())
def test_update_draft_invalid_json_schema(self): old_schema = { "type": "object", "title": "Tree", "$schema": "http://json-schema.org/draft-07/schema#", "properties": { "diameter": { "type": "integer", "description": "size in cm." } }, } object_type = ObjectTypeFactory.create() object_version = ObjectVersionFactory.create(object_type=object_type, json_schema=old_schema) url = reverse("admin:core_objecttype_change", args=[object_type.id]) get_response = self.app.get(url) save_button = get_response.html.find("input", {"name": "_save"}) self.assertIsNotNone(save_button) form = get_response.form form["versions-0-json_schema"] = "{}{" response = form.submit() self.assertEqual(response.status_code, 200) object_version.refresh_from_db() self.assertEqual(object_version.json_schema, old_schema) error_list = response.html.find("ul", {"class": "errorlist"}) # The submitted value is shown in the error self.assertIn("{}{", error_list.text) json_schema_field = response.form.fields["versions-0-json_schema"][0] # Verify that the value of the JSON schema field is the fallback value self.assertEqual(json_schema_field.value, json.dumps(old_schema))
def test_get_objecttypes_with_versions(self): object_types = ObjectTypeFactory.create_batch(2) object_versions = [ ObjectVersionFactory.create(object_type=object_type) for object_type in object_types ] for i, object_type in enumerate(object_types): with self.subTest(object_type=object_type): url = reverse("objecttype-detail", args=[object_type.uuid]) response = self.client.get(url) self.assertEqual(response.status_code, status.HTTP_200_OK) data = response.json() self.assertEqual(len(data["versions"]), 1) self.assertEqual( data["versions"], [ f"http://testserver{reverse('objectversion-detail', args=[object_type.uuid, object_versions[i].version])}" ], )