udata 9.1.2.dev30355__py2.py3-none-any.whl → 9.1.2.dev30454__py2.py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of udata might be problematic. Click here for more details.
- tasks/__init__.py +109 -107
- tasks/helpers.py +18 -18
- udata/__init__.py +4 -4
- udata/admin/views.py +5 -5
- udata/api/__init__.py +111 -134
- udata/api/commands.py +45 -37
- udata/api/errors.py +5 -4
- udata/api/fields.py +23 -21
- udata/api/oauth2.py +55 -74
- udata/api/parsers.py +15 -15
- udata/api/signals.py +1 -1
- udata/api_fields.py +137 -89
- udata/app.py +58 -55
- udata/assets.py +5 -5
- udata/auth/__init__.py +37 -26
- udata/auth/forms.py +23 -15
- udata/auth/helpers.py +1 -1
- udata/auth/mails.py +3 -3
- udata/auth/password_validation.py +19 -15
- udata/auth/views.py +94 -68
- udata/commands/__init__.py +71 -69
- udata/commands/cache.py +7 -7
- udata/commands/db.py +201 -140
- udata/commands/dcat.py +36 -30
- udata/commands/fixtures.py +100 -84
- udata/commands/images.py +21 -20
- udata/commands/info.py +17 -20
- udata/commands/init.py +10 -10
- udata/commands/purge.py +12 -13
- udata/commands/serve.py +41 -29
- udata/commands/static.py +16 -18
- udata/commands/test.py +20 -20
- udata/commands/tests/fixtures.py +26 -24
- udata/commands/worker.py +31 -33
- udata/core/__init__.py +12 -12
- udata/core/activity/__init__.py +0 -1
- udata/core/activity/api.py +59 -49
- udata/core/activity/models.py +28 -26
- udata/core/activity/signals.py +1 -1
- udata/core/activity/tasks.py +16 -10
- udata/core/badges/api.py +6 -6
- udata/core/badges/commands.py +14 -13
- udata/core/badges/fields.py +8 -5
- udata/core/badges/forms.py +7 -4
- udata/core/badges/models.py +16 -31
- udata/core/badges/permissions.py +1 -3
- udata/core/badges/signals.py +2 -2
- udata/core/badges/tasks.py +3 -2
- udata/core/badges/tests/test_commands.py +10 -10
- udata/core/badges/tests/test_model.py +24 -31
- udata/core/contact_point/api.py +19 -18
- udata/core/contact_point/api_fields.py +21 -14
- udata/core/contact_point/factories.py +2 -2
- udata/core/contact_point/forms.py +7 -6
- udata/core/contact_point/models.py +3 -5
- udata/core/dataservices/api.py +26 -21
- udata/core/dataservices/factories.py +13 -11
- udata/core/dataservices/models.py +35 -40
- udata/core/dataservices/permissions.py +4 -4
- udata/core/dataservices/rdf.py +40 -17
- udata/core/dataservices/tasks.py +4 -3
- udata/core/dataset/actions.py +10 -10
- udata/core/dataset/activities.py +21 -23
- udata/core/dataset/api.py +321 -298
- udata/core/dataset/api_fields.py +443 -271
- udata/core/dataset/apiv2.py +305 -229
- udata/core/dataset/commands.py +38 -36
- udata/core/dataset/constants.py +61 -54
- udata/core/dataset/csv.py +70 -74
- udata/core/dataset/events.py +39 -32
- udata/core/dataset/exceptions.py +8 -4
- udata/core/dataset/factories.py +57 -65
- udata/core/dataset/forms.py +87 -63
- udata/core/dataset/models.py +336 -280
- udata/core/dataset/permissions.py +9 -6
- udata/core/dataset/preview.py +15 -17
- udata/core/dataset/rdf.py +156 -122
- udata/core/dataset/search.py +92 -77
- udata/core/dataset/signals.py +1 -1
- udata/core/dataset/tasks.py +63 -54
- udata/core/discussions/actions.py +5 -5
- udata/core/discussions/api.py +124 -120
- udata/core/discussions/factories.py +2 -2
- udata/core/discussions/forms.py +9 -7
- udata/core/discussions/metrics.py +1 -3
- udata/core/discussions/models.py +25 -24
- udata/core/discussions/notifications.py +18 -14
- udata/core/discussions/permissions.py +3 -3
- udata/core/discussions/signals.py +4 -4
- udata/core/discussions/tasks.py +24 -28
- udata/core/followers/api.py +32 -33
- udata/core/followers/models.py +9 -9
- udata/core/followers/signals.py +3 -3
- udata/core/jobs/actions.py +7 -7
- udata/core/jobs/api.py +99 -92
- udata/core/jobs/commands.py +48 -49
- udata/core/jobs/forms.py +11 -11
- udata/core/jobs/models.py +6 -6
- udata/core/metrics/__init__.py +2 -2
- udata/core/metrics/commands.py +34 -30
- udata/core/metrics/models.py +2 -4
- udata/core/metrics/signals.py +1 -1
- udata/core/metrics/tasks.py +3 -3
- udata/core/organization/activities.py +12 -15
- udata/core/organization/api.py +167 -174
- udata/core/organization/api_fields.py +183 -124
- udata/core/organization/apiv2.py +32 -32
- udata/core/organization/commands.py +20 -22
- udata/core/organization/constants.py +11 -11
- udata/core/organization/csv.py +17 -15
- udata/core/organization/factories.py +8 -11
- udata/core/organization/forms.py +32 -26
- udata/core/organization/metrics.py +2 -1
- udata/core/organization/models.py +87 -67
- udata/core/organization/notifications.py +18 -14
- udata/core/organization/permissions.py +10 -11
- udata/core/organization/rdf.py +14 -14
- udata/core/organization/search.py +30 -28
- udata/core/organization/signals.py +7 -7
- udata/core/organization/tasks.py +42 -61
- udata/core/owned.py +38 -27
- udata/core/post/api.py +82 -81
- udata/core/post/constants.py +8 -5
- udata/core/post/factories.py +4 -4
- udata/core/post/forms.py +13 -14
- udata/core/post/models.py +20 -22
- udata/core/post/tests/test_api.py +30 -32
- udata/core/reports/api.py +8 -7
- udata/core/reports/constants.py +1 -3
- udata/core/reports/models.py +10 -10
- udata/core/reuse/activities.py +15 -19
- udata/core/reuse/api.py +123 -126
- udata/core/reuse/api_fields.py +120 -85
- udata/core/reuse/apiv2.py +11 -10
- udata/core/reuse/constants.py +23 -23
- udata/core/reuse/csv.py +18 -18
- udata/core/reuse/factories.py +5 -9
- udata/core/reuse/forms.py +24 -21
- udata/core/reuse/models.py +55 -51
- udata/core/reuse/permissions.py +2 -2
- udata/core/reuse/search.py +49 -46
- udata/core/reuse/signals.py +1 -1
- udata/core/reuse/tasks.py +4 -5
- udata/core/site/api.py +47 -50
- udata/core/site/factories.py +2 -2
- udata/core/site/forms.py +4 -5
- udata/core/site/models.py +94 -63
- udata/core/site/rdf.py +14 -14
- udata/core/spam/api.py +16 -9
- udata/core/spam/constants.py +4 -4
- udata/core/spam/fields.py +13 -7
- udata/core/spam/models.py +27 -20
- udata/core/spam/signals.py +1 -1
- udata/core/spam/tests/test_spam.py +6 -5
- udata/core/spatial/api.py +72 -80
- udata/core/spatial/api_fields.py +73 -58
- udata/core/spatial/commands.py +67 -64
- udata/core/spatial/constants.py +3 -3
- udata/core/spatial/factories.py +37 -54
- udata/core/spatial/forms.py +27 -26
- udata/core/spatial/geoids.py +17 -17
- udata/core/spatial/models.py +43 -47
- udata/core/spatial/tasks.py +2 -1
- udata/core/spatial/tests/test_api.py +115 -130
- udata/core/spatial/tests/test_fields.py +74 -77
- udata/core/spatial/tests/test_geoid.py +22 -22
- udata/core/spatial/tests/test_models.py +5 -7
- udata/core/spatial/translations.py +16 -16
- udata/core/storages/__init__.py +16 -18
- udata/core/storages/api.py +66 -64
- udata/core/storages/tasks.py +7 -7
- udata/core/storages/utils.py +15 -15
- udata/core/storages/views.py +5 -6
- udata/core/tags/api.py +17 -14
- udata/core/tags/csv.py +4 -4
- udata/core/tags/models.py +8 -5
- udata/core/tags/tasks.py +11 -13
- udata/core/tags/views.py +4 -4
- udata/core/topic/api.py +84 -73
- udata/core/topic/apiv2.py +157 -127
- udata/core/topic/factories.py +3 -4
- udata/core/topic/forms.py +12 -14
- udata/core/topic/models.py +14 -19
- udata/core/topic/parsers.py +26 -26
- udata/core/user/activities.py +30 -29
- udata/core/user/api.py +151 -152
- udata/core/user/api_fields.py +132 -100
- udata/core/user/apiv2.py +7 -7
- udata/core/user/commands.py +38 -38
- udata/core/user/factories.py +8 -9
- udata/core/user/forms.py +14 -11
- udata/core/user/metrics.py +2 -2
- udata/core/user/models.py +68 -69
- udata/core/user/permissions.py +4 -5
- udata/core/user/rdf.py +7 -8
- udata/core/user/tasks.py +2 -2
- udata/core/user/tests/test_user_model.py +24 -16
- udata/cors.py +99 -0
- udata/db/tasks.py +2 -1
- udata/entrypoints.py +35 -31
- udata/errors.py +2 -1
- udata/event/values.py +6 -6
- udata/factories.py +2 -2
- udata/features/identicon/api.py +5 -6
- udata/features/identicon/backends.py +48 -55
- udata/features/identicon/tests/test_backends.py +4 -5
- udata/features/notifications/__init__.py +0 -1
- udata/features/notifications/actions.py +9 -9
- udata/features/notifications/api.py +17 -13
- udata/features/territories/__init__.py +12 -10
- udata/features/territories/api.py +14 -15
- udata/features/territories/models.py +23 -28
- udata/features/transfer/actions.py +8 -11
- udata/features/transfer/api.py +84 -77
- udata/features/transfer/factories.py +2 -1
- udata/features/transfer/models.py +11 -12
- udata/features/transfer/notifications.py +19 -15
- udata/features/transfer/permissions.py +5 -5
- udata/forms/__init__.py +5 -2
- udata/forms/fields.py +164 -172
- udata/forms/validators.py +19 -22
- udata/forms/widgets.py +9 -13
- udata/frontend/__init__.py +31 -26
- udata/frontend/csv.py +68 -58
- udata/frontend/markdown.py +40 -44
- udata/harvest/actions.py +89 -77
- udata/harvest/api.py +294 -238
- udata/harvest/backends/__init__.py +4 -4
- udata/harvest/backends/base.py +128 -111
- udata/harvest/backends/dcat.py +80 -66
- udata/harvest/commands.py +56 -60
- udata/harvest/csv.py +8 -8
- udata/harvest/exceptions.py +6 -3
- udata/harvest/filters.py +24 -23
- udata/harvest/forms.py +27 -28
- udata/harvest/models.py +88 -80
- udata/harvest/notifications.py +15 -10
- udata/harvest/signals.py +13 -13
- udata/harvest/tasks.py +11 -10
- udata/harvest/tests/factories.py +23 -24
- udata/harvest/tests/test_actions.py +136 -166
- udata/harvest/tests/test_api.py +220 -214
- udata/harvest/tests/test_base_backend.py +117 -112
- udata/harvest/tests/test_dcat_backend.py +380 -308
- udata/harvest/tests/test_filters.py +33 -22
- udata/harvest/tests/test_models.py +11 -14
- udata/harvest/tests/test_notifications.py +6 -7
- udata/harvest/tests/test_tasks.py +7 -6
- udata/i18n.py +237 -78
- udata/linkchecker/backends.py +5 -11
- udata/linkchecker/checker.py +23 -22
- udata/linkchecker/commands.py +4 -6
- udata/linkchecker/models.py +6 -6
- udata/linkchecker/tasks.py +18 -20
- udata/mail.py +21 -21
- udata/migrations/2020-07-24-remove-s-from-scope-oauth.py +9 -8
- udata/migrations/2020-08-24-add-fs-filename.py +9 -8
- udata/migrations/2020-09-28-update-reuses-datasets-metrics.py +5 -4
- udata/migrations/2020-10-16-migrate-ods-resources.py +9 -10
- udata/migrations/2021-04-08-update-schema-with-new-structure.py +8 -7
- udata/migrations/2021-05-27-fix-default-schema-name.py +7 -6
- udata/migrations/2021-07-05-remove-unused-badges.py +17 -15
- udata/migrations/2021-07-07-update-schema-for-community-resources.py +7 -6
- udata/migrations/2021-08-17-follow-integrity.py +5 -4
- udata/migrations/2021-08-17-harvest-integrity.py +13 -12
- udata/migrations/2021-08-17-oauth2client-integrity.py +5 -4
- udata/migrations/2021-08-17-transfer-integrity.py +5 -4
- udata/migrations/2021-08-17-users-integrity.py +9 -8
- udata/migrations/2021-12-14-reuse-topics.py +7 -6
- udata/migrations/2022-04-21-improve-extension-detection.py +8 -7
- udata/migrations/2022-09-22-clean-inactive-harvest-datasets.py +16 -14
- udata/migrations/2022-10-10-add-fs_uniquifier-to-user-model.py +6 -6
- udata/migrations/2022-10-10-migrate-harvest-extras.py +36 -26
- udata/migrations/2023-02-08-rename-internal-dates.py +46 -28
- udata/migrations/2024-01-29-fix-reuse-and-dataset-with-private-None.py +10 -8
- udata/migrations/2024-03-22-migrate-activity-kwargs-to-extras.py +6 -4
- udata/migrations/2024-06-11-fix-reuse-datasets-references.py +7 -6
- udata/migrations/__init__.py +123 -105
- udata/models/__init__.py +4 -4
- udata/mongo/__init__.py +13 -11
- udata/mongo/badges_field.py +3 -2
- udata/mongo/datetime_fields.py +13 -12
- udata/mongo/document.py +17 -16
- udata/mongo/engine.py +15 -16
- udata/mongo/errors.py +2 -1
- udata/mongo/extras_fields.py +30 -20
- udata/mongo/queryset.py +12 -12
- udata/mongo/slug_fields.py +38 -28
- udata/mongo/taglist_field.py +1 -2
- udata/mongo/url_field.py +5 -5
- udata/mongo/uuid_fields.py +4 -3
- udata/notifications/__init__.py +1 -1
- udata/notifications/mattermost.py +10 -9
- udata/rdf.py +167 -188
- udata/routing.py +40 -45
- udata/search/__init__.py +18 -19
- udata/search/adapter.py +17 -16
- udata/search/commands.py +44 -51
- udata/search/fields.py +13 -20
- udata/search/query.py +23 -18
- udata/search/result.py +9 -10
- udata/sentry.py +21 -19
- udata/settings.py +262 -198
- udata/sitemap.py +8 -6
- udata/storage/s3.py +20 -13
- udata/tags.py +4 -5
- udata/tasks.py +43 -42
- udata/tests/__init__.py +9 -6
- udata/tests/api/__init__.py +8 -6
- udata/tests/api/test_auth_api.py +395 -321
- udata/tests/api/test_base_api.py +33 -35
- udata/tests/api/test_contact_points.py +7 -9
- udata/tests/api/test_dataservices_api.py +211 -158
- udata/tests/api/test_datasets_api.py +823 -812
- udata/tests/api/test_follow_api.py +13 -15
- udata/tests/api/test_me_api.py +95 -112
- udata/tests/api/test_organizations_api.py +301 -339
- udata/tests/api/test_reports_api.py +35 -25
- udata/tests/api/test_reuses_api.py +134 -139
- udata/tests/api/test_swagger.py +5 -5
- udata/tests/api/test_tags_api.py +18 -25
- udata/tests/api/test_topics_api.py +94 -94
- udata/tests/api/test_transfer_api.py +53 -48
- udata/tests/api/test_user_api.py +128 -141
- udata/tests/apiv2/test_datasets.py +290 -198
- udata/tests/apiv2/test_me_api.py +10 -11
- udata/tests/apiv2/test_organizations.py +56 -74
- udata/tests/apiv2/test_swagger.py +5 -5
- udata/tests/apiv2/test_topics.py +69 -87
- udata/tests/cli/test_cli_base.py +8 -8
- udata/tests/cli/test_db_cli.py +21 -19
- udata/tests/dataservice/test_dataservice_tasks.py +8 -12
- udata/tests/dataset/test_csv_adapter.py +44 -35
- udata/tests/dataset/test_dataset_actions.py +2 -3
- udata/tests/dataset/test_dataset_commands.py +7 -8
- udata/tests/dataset/test_dataset_events.py +36 -29
- udata/tests/dataset/test_dataset_model.py +224 -217
- udata/tests/dataset/test_dataset_rdf.py +142 -131
- udata/tests/dataset/test_dataset_tasks.py +15 -15
- udata/tests/dataset/test_resource_preview.py +10 -13
- udata/tests/features/territories/__init__.py +9 -13
- udata/tests/features/territories/test_territories_api.py +71 -91
- udata/tests/forms/test_basic_fields.py +7 -7
- udata/tests/forms/test_current_user_field.py +39 -66
- udata/tests/forms/test_daterange_field.py +31 -39
- udata/tests/forms/test_dict_field.py +28 -26
- udata/tests/forms/test_extras_fields.py +102 -76
- udata/tests/forms/test_form_field.py +8 -8
- udata/tests/forms/test_image_field.py +33 -26
- udata/tests/forms/test_model_field.py +134 -123
- udata/tests/forms/test_model_list_field.py +7 -7
- udata/tests/forms/test_nested_model_list_field.py +117 -79
- udata/tests/forms/test_publish_as_field.py +36 -65
- udata/tests/forms/test_reference_field.py +34 -53
- udata/tests/forms/test_user_forms.py +23 -21
- udata/tests/forms/test_uuid_field.py +6 -10
- udata/tests/frontend/__init__.py +9 -6
- udata/tests/frontend/test_auth.py +7 -6
- udata/tests/frontend/test_csv.py +81 -96
- udata/tests/frontend/test_hooks.py +43 -43
- udata/tests/frontend/test_markdown.py +211 -191
- udata/tests/helpers.py +32 -37
- udata/tests/models.py +2 -2
- udata/tests/organization/test_csv_adapter.py +21 -16
- udata/tests/organization/test_notifications.py +11 -18
- udata/tests/organization/test_organization_model.py +13 -13
- udata/tests/organization/test_organization_rdf.py +29 -22
- udata/tests/organization/test_organization_tasks.py +16 -17
- udata/tests/plugin.py +79 -73
- udata/tests/reuse/test_reuse_model.py +21 -21
- udata/tests/reuse/test_reuse_task.py +11 -13
- udata/tests/search/__init__.py +11 -12
- udata/tests/search/test_adapter.py +60 -70
- udata/tests/search/test_query.py +16 -16
- udata/tests/search/test_results.py +10 -7
- udata/tests/site/test_site_api.py +11 -16
- udata/tests/site/test_site_metrics.py +20 -30
- udata/tests/site/test_site_model.py +4 -5
- udata/tests/site/test_site_rdf.py +94 -78
- udata/tests/test_activity.py +17 -17
- udata/tests/test_cors.py +62 -0
- udata/tests/test_discussions.py +292 -299
- udata/tests/test_i18n.py +37 -40
- udata/tests/test_linkchecker.py +91 -85
- udata/tests/test_mail.py +13 -17
- udata/tests/test_migrations.py +219 -180
- udata/tests/test_model.py +164 -157
- udata/tests/test_notifications.py +17 -17
- udata/tests/test_owned.py +14 -14
- udata/tests/test_rdf.py +25 -23
- udata/tests/test_routing.py +89 -93
- udata/tests/test_storages.py +137 -128
- udata/tests/test_tags.py +44 -46
- udata/tests/test_topics.py +7 -7
- udata/tests/test_transfer.py +42 -49
- udata/tests/test_uris.py +160 -161
- udata/tests/test_utils.py +79 -71
- udata/tests/user/test_user_rdf.py +5 -9
- udata/tests/workers/test_jobs_commands.py +57 -58
- udata/tests/workers/test_tasks_routing.py +23 -29
- udata/tests/workers/test_workers_api.py +125 -131
- udata/tests/workers/test_workers_helpers.py +6 -6
- udata/tracking.py +4 -6
- udata/uris.py +45 -46
- udata/utils.py +68 -66
- udata/wsgi.py +1 -1
- {udata-9.1.2.dev30355.dist-info → udata-9.1.2.dev30454.dist-info}/METADATA +7 -3
- udata-9.1.2.dev30454.dist-info/RECORD +706 -0
- udata-9.1.2.dev30355.dist-info/RECORD +0 -704
- {udata-9.1.2.dev30355.dist-info → udata-9.1.2.dev30454.dist-info}/LICENSE +0 -0
- {udata-9.1.2.dev30355.dist-info → udata-9.1.2.dev30454.dist-info}/WHEEL +0 -0
- {udata-9.1.2.dev30355.dist-info → udata-9.1.2.dev30454.dist-info}/entry_points.txt +0 -0
- {udata-9.1.2.dev30355.dist-info → udata-9.1.2.dev30454.dist-info}/top_level.txt +0 -0
udata/tests/apiv2/test_me_api.py
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
from flask import url_for
|
|
2
2
|
|
|
3
|
-
from udata.models import Member
|
|
4
3
|
from udata.core.organization.factories import OrganizationFactory
|
|
5
4
|
from udata.core.topic.factories import TopicFactory
|
|
5
|
+
from udata.models import Member
|
|
6
6
|
from udata.tests.api import APITestCase
|
|
7
7
|
|
|
8
8
|
|
|
@@ -11,30 +11,29 @@ class MeAPIv2Test(APITestCase):
|
|
|
11
11
|
|
|
12
12
|
def test_my_org_topics(self):
|
|
13
13
|
user = self.login()
|
|
14
|
-
member = Member(user=user, role=
|
|
14
|
+
member = Member(user=user, role="editor")
|
|
15
15
|
organization = OrganizationFactory(members=[member])
|
|
16
16
|
topics = [
|
|
17
|
-
TopicFactory(organization=organization, private=False, tags=[
|
|
17
|
+
TopicFactory(organization=organization, private=False, tags=["energy"]),
|
|
18
18
|
TopicFactory(organization=organization, private=True),
|
|
19
19
|
TopicFactory(owner=user),
|
|
20
20
|
]
|
|
21
21
|
# another topic that shouldn't pop up
|
|
22
22
|
TopicFactory()
|
|
23
23
|
|
|
24
|
-
response = self.get(url_for(
|
|
24
|
+
response = self.get(url_for("apiv2.my_org_topics"))
|
|
25
25
|
assert response.status_code == 200
|
|
26
|
-
data = response.json[
|
|
26
|
+
data = response.json["data"]
|
|
27
27
|
assert len(data) == 3
|
|
28
28
|
assert all(
|
|
29
|
-
str(topic.id) in [remote_topic["id"] for remote_topic in data]
|
|
30
|
-
for topic in topics
|
|
29
|
+
str(topic.id) in [remote_topic["id"] for remote_topic in data] for topic in topics
|
|
31
30
|
)
|
|
32
|
-
assert
|
|
31
|
+
assert "rel" in data[0]["datasets"]
|
|
33
32
|
|
|
34
33
|
# topic parser is already tested in topics test
|
|
35
34
|
# we're just making sure one of theme is working
|
|
36
|
-
response = self.get(url_for(
|
|
35
|
+
response = self.get(url_for("apiv2.my_org_topics", tag="energy"))
|
|
37
36
|
assert response.status_code == 200
|
|
38
|
-
data = response.json[
|
|
37
|
+
data = response.json["data"]
|
|
39
38
|
assert len(data) == 1
|
|
40
|
-
assert data[0][
|
|
39
|
+
assert data[0]["id"] == str(topics[0].id)
|
|
@@ -1,71 +1,70 @@
|
|
|
1
1
|
from flask import url_for
|
|
2
2
|
|
|
3
|
+
from udata.core.organization.factories import Member, OrganizationFactory
|
|
3
4
|
from udata.tests.api import APITestCase
|
|
4
5
|
|
|
5
|
-
from udata.core.organization.factories import OrganizationFactory, Member
|
|
6
|
-
|
|
7
6
|
|
|
8
7
|
class OrganizationExtrasAPITest(APITestCase):
|
|
9
8
|
modules = None
|
|
10
9
|
|
|
11
10
|
def setUp(self):
|
|
12
11
|
self.login()
|
|
13
|
-
member = Member(user=self.user, role=
|
|
12
|
+
member = Member(user=self.user, role="admin")
|
|
14
13
|
self.org = OrganizationFactory(members=[member])
|
|
15
14
|
|
|
16
15
|
def test_get_organization_extras(self):
|
|
17
|
-
self.org.extras = {
|
|
16
|
+
self.org.extras = {"test::extra": "test-value"}
|
|
18
17
|
self.org.save()
|
|
19
|
-
response = self.get(url_for(
|
|
18
|
+
response = self.get(url_for("apiv2.organization_extras", org=self.org))
|
|
20
19
|
self.assert200(response)
|
|
21
20
|
data = response.json
|
|
22
|
-
assert data[
|
|
21
|
+
assert data["test::extra"] == "test-value"
|
|
23
22
|
|
|
24
23
|
def test_update_organization_extras(self):
|
|
25
24
|
self.org.extras = {
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
25
|
+
"test::extra": "test-value",
|
|
26
|
+
"test::extra-second": "test-value-second",
|
|
27
|
+
"test::none-will-be-deleted": "test-value",
|
|
29
28
|
}
|
|
30
29
|
self.org.save()
|
|
31
30
|
|
|
32
|
-
data = [
|
|
33
|
-
response = self.put(url_for(
|
|
31
|
+
data = ["test::extra-second", "another::key"]
|
|
32
|
+
response = self.put(url_for("apiv2.organization_extras", org=self.org), data)
|
|
34
33
|
self.assert400(response)
|
|
35
|
-
assert response.json[
|
|
34
|
+
assert response.json["message"] == "Wrong payload format, dict expected"
|
|
36
35
|
|
|
37
36
|
data = {
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
37
|
+
"test::extra-second": "test-value-changed",
|
|
38
|
+
"another::key": "another-value",
|
|
39
|
+
"test::none": None,
|
|
40
|
+
"test::none-will-be-deleted": None,
|
|
42
41
|
}
|
|
43
|
-
response = self.put(url_for(
|
|
42
|
+
response = self.put(url_for("apiv2.organization_extras", org=self.org), data)
|
|
44
43
|
self.assert200(response)
|
|
45
44
|
|
|
46
45
|
self.org.reload()
|
|
47
|
-
assert self.org.extras[
|
|
48
|
-
assert self.org.extras[
|
|
49
|
-
assert self.org.extras[
|
|
50
|
-
assert
|
|
51
|
-
assert
|
|
46
|
+
assert self.org.extras["test::extra"] == "test-value"
|
|
47
|
+
assert self.org.extras["test::extra-second"] == "test-value-changed"
|
|
48
|
+
assert self.org.extras["another::key"] == "another-value"
|
|
49
|
+
assert "test::none" not in self.org.extras
|
|
50
|
+
assert "test::none-will-be-deleted" not in self.org.extras
|
|
52
51
|
|
|
53
52
|
def test_delete_organization_extras(self):
|
|
54
|
-
self.org.extras = {
|
|
53
|
+
self.org.extras = {"test::extra": "test-value", "another::key": "another-value"}
|
|
55
54
|
self.org.save()
|
|
56
55
|
|
|
57
|
-
data = {
|
|
58
|
-
response = self.delete(url_for(
|
|
56
|
+
data = {"another::key": "another-value"}
|
|
57
|
+
response = self.delete(url_for("apiv2.organization_extras", org=self.org), data)
|
|
59
58
|
self.assert400(response)
|
|
60
|
-
assert response.json[
|
|
59
|
+
assert response.json["message"] == "Wrong payload format, list expected"
|
|
61
60
|
|
|
62
|
-
data = [
|
|
63
|
-
response = self.delete(url_for(
|
|
61
|
+
data = ["another::key"]
|
|
62
|
+
response = self.delete(url_for("apiv2.organization_extras", org=self.org), data)
|
|
64
63
|
self.assert204(response)
|
|
65
64
|
|
|
66
65
|
self.org.reload()
|
|
67
66
|
assert len(self.org.extras) == 1
|
|
68
|
-
assert self.org.extras[
|
|
67
|
+
assert self.org.extras["test::extra"] == "test-value"
|
|
69
68
|
|
|
70
69
|
def test_update_organization_custom_extras(self):
|
|
71
70
|
# Wrong type
|
|
@@ -74,47 +73,32 @@ class OrganizationExtrasAPITest(APITestCase):
|
|
|
74
73
|
{
|
|
75
74
|
"title": "color",
|
|
76
75
|
"description": "the banner color of the dataset (Hex code)",
|
|
77
|
-
"type": "tuple"
|
|
76
|
+
"type": "tuple",
|
|
78
77
|
}
|
|
79
78
|
]
|
|
80
79
|
}
|
|
81
|
-
response = self.put(url_for(
|
|
80
|
+
response = self.put(url_for("apiv2.organization_extras", org=self.org), data)
|
|
82
81
|
self.assert400(response)
|
|
83
82
|
|
|
84
83
|
# Missing title
|
|
85
84
|
data = {
|
|
86
|
-
"custom": [
|
|
87
|
-
{
|
|
88
|
-
"description": "the banner color of the dataset (Hex code)",
|
|
89
|
-
"type": "str"
|
|
90
|
-
}
|
|
91
|
-
]
|
|
85
|
+
"custom": [{"description": "the banner color of the dataset (Hex code)", "type": "str"}]
|
|
92
86
|
}
|
|
93
|
-
response = self.put(url_for(
|
|
87
|
+
response = self.put(url_for("apiv2.organization_extras", org=self.org), data)
|
|
94
88
|
self.assert400(response)
|
|
95
89
|
|
|
96
90
|
# Missing description
|
|
97
|
-
data = {
|
|
98
|
-
|
|
99
|
-
{
|
|
100
|
-
"title": "color",
|
|
101
|
-
"type": "str"
|
|
102
|
-
}
|
|
103
|
-
]
|
|
104
|
-
}
|
|
105
|
-
response = self.put(url_for('apiv2.organization_extras', org=self.org), data)
|
|
91
|
+
data = {"custom": [{"title": "color", "type": "str"}]}
|
|
92
|
+
response = self.put(url_for("apiv2.organization_extras", org=self.org), data)
|
|
106
93
|
self.assert400(response)
|
|
107
94
|
|
|
108
95
|
# Missing type
|
|
109
96
|
data = {
|
|
110
97
|
"custom": [
|
|
111
|
-
{
|
|
112
|
-
"title": "color",
|
|
113
|
-
"description": "the banner color of the dataset (Hex code)"
|
|
114
|
-
}
|
|
98
|
+
{"title": "color", "description": "the banner color of the dataset (Hex code)"}
|
|
115
99
|
]
|
|
116
100
|
}
|
|
117
|
-
response = self.put(url_for(
|
|
101
|
+
response = self.put(url_for("apiv2.organization_extras", org=self.org), data)
|
|
118
102
|
self.assert400(response)
|
|
119
103
|
|
|
120
104
|
# Choice type but missing choices key
|
|
@@ -123,11 +107,11 @@ class OrganizationExtrasAPITest(APITestCase):
|
|
|
123
107
|
{
|
|
124
108
|
"title": "color",
|
|
125
109
|
"description": "the banner color of the dataset (Hex code)",
|
|
126
|
-
"type": "choice"
|
|
110
|
+
"type": "choice",
|
|
127
111
|
}
|
|
128
112
|
]
|
|
129
113
|
}
|
|
130
|
-
response = self.put(url_for(
|
|
114
|
+
response = self.put(url_for("apiv2.organization_extras", org=self.org), data)
|
|
131
115
|
self.assert400(response)
|
|
132
116
|
|
|
133
117
|
# Str type but present choices key
|
|
@@ -137,25 +121,20 @@ class OrganizationExtrasAPITest(APITestCase):
|
|
|
137
121
|
"title": "color",
|
|
138
122
|
"description": "the banner color of the dataset (Hex code)",
|
|
139
123
|
"type": "str",
|
|
140
|
-
"choices": ["yellow"]
|
|
124
|
+
"choices": ["yellow"],
|
|
141
125
|
}
|
|
142
126
|
]
|
|
143
127
|
}
|
|
144
|
-
response = self.put(url_for(
|
|
128
|
+
response = self.put(url_for("apiv2.organization_extras", org=self.org), data)
|
|
145
129
|
self.assert400(response)
|
|
146
130
|
|
|
147
131
|
# Choice type but empty list choices
|
|
148
132
|
data = {
|
|
149
133
|
"custom": [
|
|
150
|
-
{
|
|
151
|
-
"title": "lispum",
|
|
152
|
-
"description": "lispum",
|
|
153
|
-
"type": "choice",
|
|
154
|
-
"choices": []
|
|
155
|
-
}
|
|
134
|
+
{"title": "lispum", "description": "lispum", "type": "choice", "choices": []}
|
|
156
135
|
]
|
|
157
136
|
}
|
|
158
|
-
response = self.put(url_for(
|
|
137
|
+
response = self.put(url_for("apiv2.organization_extras", org=self.org), data)
|
|
159
138
|
self.assert400(response)
|
|
160
139
|
|
|
161
140
|
data = {
|
|
@@ -163,16 +142,19 @@ class OrganizationExtrasAPITest(APITestCase):
|
|
|
163
142
|
{
|
|
164
143
|
"title": "color",
|
|
165
144
|
"description": "the banner color of the dataset (Hex code)",
|
|
166
|
-
"type": "str"
|
|
145
|
+
"type": "str",
|
|
167
146
|
}
|
|
168
147
|
]
|
|
169
148
|
}
|
|
170
|
-
response = self.put(url_for(
|
|
149
|
+
response = self.put(url_for("apiv2.organization_extras", org=self.org), data)
|
|
171
150
|
self.assert200(response)
|
|
172
151
|
self.org.reload()
|
|
173
|
-
assert self.org.extras[
|
|
174
|
-
assert
|
|
175
|
-
|
|
152
|
+
assert self.org.extras["custom"][0]["title"] == "color"
|
|
153
|
+
assert (
|
|
154
|
+
self.org.extras["custom"][0]["description"]
|
|
155
|
+
== "the banner color of the dataset (Hex code)"
|
|
156
|
+
)
|
|
157
|
+
assert self.org.extras["custom"][0]["type"] == "str"
|
|
176
158
|
|
|
177
159
|
data = {
|
|
178
160
|
"custom": [
|
|
@@ -180,14 +162,14 @@ class OrganizationExtrasAPITest(APITestCase):
|
|
|
180
162
|
"title": "lispum",
|
|
181
163
|
"description": "lispum",
|
|
182
164
|
"type": "choice",
|
|
183
|
-
"choices": [
|
|
165
|
+
"choices": ["lorem", "ipsum"],
|
|
184
166
|
}
|
|
185
167
|
]
|
|
186
168
|
}
|
|
187
|
-
response = self.put(url_for(
|
|
169
|
+
response = self.put(url_for("apiv2.organization_extras", org=self.org), data)
|
|
188
170
|
self.assert200(response)
|
|
189
171
|
self.org.reload()
|
|
190
|
-
assert self.org.extras[
|
|
191
|
-
assert self.org.extras[
|
|
192
|
-
assert self.org.extras[
|
|
193
|
-
assert self.org.extras[
|
|
172
|
+
assert self.org.extras["custom"][0]["title"] == "lispum"
|
|
173
|
+
assert self.org.extras["custom"][0]["description"] == "lispum"
|
|
174
|
+
assert self.org.extras["custom"][0]["type"] == "choice"
|
|
175
|
+
assert self.org.extras["custom"][0]["choices"] == ["lorem", "ipsum"]
|
|
@@ -10,15 +10,15 @@ class SwaggerBlueprintTest:
|
|
|
10
10
|
modules = []
|
|
11
11
|
|
|
12
12
|
def test_swagger_resource_type(self, api):
|
|
13
|
-
response = api.get(url_for(
|
|
13
|
+
response = api.get(url_for("apiv2.specs"))
|
|
14
14
|
assert200(response)
|
|
15
15
|
swagger = json.loads(response.data)
|
|
16
|
-
expected = swagger[
|
|
17
|
-
expected = expected[
|
|
18
|
-
assert expected ==
|
|
16
|
+
expected = swagger["paths"]["/datasets/{dataset}/resources/"]
|
|
17
|
+
expected = expected["get"]["responses"]["200"]["schema"]["$ref"]
|
|
18
|
+
assert expected == "#/definitions/ResourcePage"
|
|
19
19
|
|
|
20
20
|
def test_swagger_specs_validate(self, api):
|
|
21
|
-
response = api.get(url_for(
|
|
21
|
+
response = api.get(url_for("apiv2.specs"))
|
|
22
22
|
try:
|
|
23
23
|
schemas.validate(response.json)
|
|
24
24
|
except schemas.SchemaValidationError as e:
|
udata/tests/apiv2/test_topics.py
CHANGED
|
@@ -2,8 +2,8 @@ from flask import url_for
|
|
|
2
2
|
|
|
3
3
|
from udata.core.dataset.factories import DatasetFactory
|
|
4
4
|
from udata.core.organization.factories import OrganizationFactory
|
|
5
|
-
from udata.core.spatial.factories import SpatialCoverageFactory
|
|
6
5
|
from udata.core.reuse.factories import ReuseFactory
|
|
6
|
+
from udata.core.spatial.factories import SpatialCoverageFactory
|
|
7
7
|
from udata.core.topic.factories import TopicFactory
|
|
8
8
|
from udata.core.user.factories import UserFactory
|
|
9
9
|
from udata.tests.api import APITestCase
|
|
@@ -14,100 +14,98 @@ class TopicsAPITest(APITestCase):
|
|
|
14
14
|
modules = []
|
|
15
15
|
|
|
16
16
|
def test_topic_api_list(self):
|
|
17
|
-
|
|
17
|
+
"""It should fetch a topic list from the API"""
|
|
18
18
|
owner = UserFactory()
|
|
19
19
|
org = OrganizationFactory()
|
|
20
20
|
paca, _, _ = create_geozones_fixtures()
|
|
21
21
|
|
|
22
|
-
tag_topic = TopicFactory(tags=[
|
|
23
|
-
name_topic = TopicFactory(name=
|
|
22
|
+
tag_topic = TopicFactory(tags=["energy"])
|
|
23
|
+
name_topic = TopicFactory(name="topic-for-query")
|
|
24
24
|
private_topic = TopicFactory(private=True)
|
|
25
25
|
geozone_topic = TopicFactory(spatial=SpatialCoverageFactory(zones=[paca.id]))
|
|
26
|
-
granularity_topic = TopicFactory(
|
|
27
|
-
spatial=SpatialCoverageFactory(granularity='country')
|
|
28
|
-
)
|
|
26
|
+
granularity_topic = TopicFactory(spatial=SpatialCoverageFactory(granularity="country"))
|
|
29
27
|
owner_topic = TopicFactory(owner=owner)
|
|
30
28
|
org_topic = TopicFactory(organization=org)
|
|
31
29
|
|
|
32
|
-
response = self.get(url_for(
|
|
30
|
+
response = self.get(url_for("apiv2.topics_list"))
|
|
33
31
|
assert response.status_code == 200
|
|
34
|
-
data = response.json[
|
|
32
|
+
data = response.json["data"]
|
|
35
33
|
assert len(data) == 6
|
|
36
34
|
|
|
37
35
|
hateoas_fields = ["rel", "href", "type", "total"]
|
|
38
36
|
assert all(k in data[0]["datasets"] for k in hateoas_fields)
|
|
39
37
|
assert all(k in data[0]["reuses"] for k in hateoas_fields)
|
|
40
38
|
|
|
41
|
-
response = self.get(url_for(
|
|
39
|
+
response = self.get(url_for("apiv2.topics_list", q="topic-for"))
|
|
42
40
|
assert response.status_code == 200
|
|
43
|
-
assert len(response.json[
|
|
44
|
-
assert response.json[
|
|
41
|
+
assert len(response.json["data"]) == 1
|
|
42
|
+
assert response.json["data"][0]["id"] == str(name_topic.id)
|
|
45
43
|
|
|
46
|
-
response = self.get(url_for(
|
|
44
|
+
response = self.get(url_for("apiv2.topics_list", tag="energy"))
|
|
47
45
|
assert response.status_code == 200
|
|
48
|
-
assert len(response.json[
|
|
49
|
-
assert response.json[
|
|
46
|
+
assert len(response.json["data"]) == 1
|
|
47
|
+
assert response.json["data"][0]["id"] == str(tag_topic.id)
|
|
50
48
|
|
|
51
|
-
response = self.get(url_for(
|
|
49
|
+
response = self.get(url_for("api.topics", include_private="true"))
|
|
52
50
|
assert response.status_code == 200
|
|
53
|
-
assert len(response.json[
|
|
54
|
-
assert str(private_topic.id) in [t[
|
|
51
|
+
assert len(response.json["data"]) == 7
|
|
52
|
+
assert str(private_topic.id) in [t["id"] for t in response.json["data"]]
|
|
55
53
|
|
|
56
|
-
response = self.get(url_for(
|
|
54
|
+
response = self.get(url_for("api.topics", geozone=paca.id))
|
|
57
55
|
assert response.status_code == 200
|
|
58
|
-
assert len(response.json[
|
|
59
|
-
assert str(geozone_topic.id) in [t[
|
|
56
|
+
assert len(response.json["data"]) == 1
|
|
57
|
+
assert str(geozone_topic.id) in [t["id"] for t in response.json["data"]]
|
|
60
58
|
|
|
61
|
-
response = self.get(url_for(
|
|
59
|
+
response = self.get(url_for("api.topics", granularity="country"))
|
|
62
60
|
assert response.status_code == 200
|
|
63
|
-
assert len(response.json[
|
|
64
|
-
assert str(granularity_topic.id) in [t[
|
|
61
|
+
assert len(response.json["data"]) == 1
|
|
62
|
+
assert str(granularity_topic.id) in [t["id"] for t in response.json["data"]]
|
|
65
63
|
|
|
66
|
-
response = self.get(url_for(
|
|
64
|
+
response = self.get(url_for("api.topics", owner=owner.id))
|
|
67
65
|
assert response.status_code == 200
|
|
68
|
-
assert len(response.json[
|
|
69
|
-
assert str(owner_topic.id) in [t[
|
|
66
|
+
assert len(response.json["data"]) == 1
|
|
67
|
+
assert str(owner_topic.id) in [t["id"] for t in response.json["data"]]
|
|
70
68
|
|
|
71
|
-
response = self.get(url_for(
|
|
69
|
+
response = self.get(url_for("api.topics", organization=org.id))
|
|
72
70
|
assert response.status_code == 200
|
|
73
|
-
assert len(response.json[
|
|
74
|
-
assert str(org_topic.id) in [t[
|
|
71
|
+
assert len(response.json["data"]) == 1
|
|
72
|
+
assert str(org_topic.id) in [t["id"] for t in response.json["data"]]
|
|
75
73
|
|
|
76
74
|
def test_topic_api_get(self):
|
|
77
|
-
|
|
75
|
+
"""It should fetch a topic from the API"""
|
|
78
76
|
topic = TopicFactory()
|
|
79
|
-
topic_response = self.get(url_for(
|
|
77
|
+
topic_response = self.get(url_for("apiv2.topic", topic=topic))
|
|
80
78
|
assert topic_response.status_code == 200
|
|
81
|
-
assert
|
|
79
|
+
assert "spatial" in topic_response.json
|
|
82
80
|
|
|
83
|
-
assert topic_response.json[
|
|
84
|
-
assert topic_response.json[
|
|
81
|
+
assert topic_response.json["created_at"] is not None
|
|
82
|
+
assert topic_response.json["last_modified"] is not None
|
|
85
83
|
|
|
86
|
-
response = self.get(topic_response.json[
|
|
84
|
+
response = self.get(topic_response.json["datasets"]["href"])
|
|
87
85
|
data = response.json
|
|
88
|
-
assert all(str(d.id) in (_d[
|
|
86
|
+
assert all(str(d.id) in (_d["id"] for _d in data["data"]) for d in topic.datasets)
|
|
89
87
|
|
|
90
|
-
response = self.get(topic_response.json[
|
|
88
|
+
response = self.get(topic_response.json["reuses"]["href"])
|
|
91
89
|
data = response.json
|
|
92
|
-
assert all(str(r.id) in (_r[
|
|
90
|
+
assert all(str(r.id) in (_r["id"] for _r in data["data"]) for r in topic.reuses)
|
|
93
91
|
|
|
94
92
|
|
|
95
93
|
class TopicDatasetsAPITest(APITestCase):
|
|
96
94
|
def test_list(self):
|
|
97
95
|
topic = TopicFactory()
|
|
98
|
-
response = self.get(url_for(
|
|
96
|
+
response = self.get(url_for("apiv2.topic_datasets", topic=topic))
|
|
99
97
|
assert response.status_code == 200
|
|
100
|
-
data = response.json[
|
|
98
|
+
data = response.json["data"]
|
|
101
99
|
assert len(data) == 3
|
|
102
|
-
assert all(str(d.id) in (_d[
|
|
100
|
+
assert all(str(d.id) in (_d["id"] for _d in data) for d in topic.datasets)
|
|
103
101
|
|
|
104
102
|
def test_add_datasets(self):
|
|
105
103
|
owner = self.login()
|
|
106
104
|
topic = TopicFactory(owner=owner)
|
|
107
105
|
d1, d2 = DatasetFactory.create_batch(2)
|
|
108
|
-
response = self.post(
|
|
109
|
-
{
|
|
110
|
-
|
|
106
|
+
response = self.post(
|
|
107
|
+
url_for("apiv2.topic_datasets", topic=topic), [{"id": d1.id}, {"id": d2.id}]
|
|
108
|
+
)
|
|
111
109
|
assert response.status_code == 201
|
|
112
110
|
topic.reload()
|
|
113
111
|
assert len(topic.datasets) == 5
|
|
@@ -117,15 +115,13 @@ class TopicDatasetsAPITest(APITestCase):
|
|
|
117
115
|
owner = self.login()
|
|
118
116
|
topic = TopicFactory(owner=owner)
|
|
119
117
|
dataset = DatasetFactory()
|
|
120
|
-
response = self.post(
|
|
121
|
-
{
|
|
122
|
-
|
|
118
|
+
response = self.post(
|
|
119
|
+
url_for("apiv2.topic_datasets", topic=topic), [{"id": dataset.id}, {"id": dataset.id}]
|
|
120
|
+
)
|
|
123
121
|
assert response.status_code == 201
|
|
124
122
|
topic.reload()
|
|
125
123
|
assert len(topic.datasets) == 4
|
|
126
|
-
response = self.post(url_for(
|
|
127
|
-
{'id': dataset.id}
|
|
128
|
-
])
|
|
124
|
+
response = self.post(url_for("apiv2.topic_datasets", topic=topic), [{"id": dataset.id}])
|
|
129
125
|
assert response.status_code == 201
|
|
130
126
|
topic.reload()
|
|
131
127
|
assert len(topic.datasets) == 4
|
|
@@ -135,23 +131,17 @@ class TopicDatasetsAPITest(APITestCase):
|
|
|
135
131
|
topic = TopicFactory(owner=user)
|
|
136
132
|
dataset = DatasetFactory()
|
|
137
133
|
self.login()
|
|
138
|
-
response = self.post(url_for(
|
|
139
|
-
{'id': dataset.id}
|
|
140
|
-
])
|
|
134
|
+
response = self.post(url_for("apiv2.topic_datasets", topic=topic), [{"id": dataset.id}])
|
|
141
135
|
assert response.status_code == 403
|
|
142
136
|
|
|
143
137
|
def test_add_datasets_wrong_payload(self):
|
|
144
138
|
owner = self.login()
|
|
145
139
|
topic = TopicFactory(owner=owner)
|
|
146
|
-
response = self.post(url_for(
|
|
147
|
-
{'id': 'xxx'}
|
|
148
|
-
])
|
|
140
|
+
response = self.post(url_for("apiv2.topic_datasets", topic=topic), [{"id": "xxx"}])
|
|
149
141
|
assert response.status_code == 400
|
|
150
|
-
response = self.post(url_for(
|
|
151
|
-
{'nain': 'portekoi'}
|
|
152
|
-
])
|
|
142
|
+
response = self.post(url_for("apiv2.topic_datasets", topic=topic), [{"nain": "portekoi"}])
|
|
153
143
|
assert response.status_code == 400
|
|
154
|
-
response = self.post(url_for(
|
|
144
|
+
response = self.post(url_for("apiv2.topic_datasets", topic=topic), {"non": "mais"})
|
|
155
145
|
assert response.status_code == 400
|
|
156
146
|
|
|
157
147
|
|
|
@@ -160,7 +150,7 @@ class TopicDatasetAPITest(APITestCase):
|
|
|
160
150
|
owner = self.login()
|
|
161
151
|
topic = TopicFactory(owner=owner)
|
|
162
152
|
dataset = topic.datasets[0]
|
|
163
|
-
response = self.delete(url_for(
|
|
153
|
+
response = self.delete(url_for("apiv2.topic_dataset", topic=topic, dataset=dataset))
|
|
164
154
|
assert response.status_code == 204
|
|
165
155
|
topic.reload()
|
|
166
156
|
assert len(topic.datasets) == 2
|
|
@@ -170,26 +160,26 @@ class TopicDatasetAPITest(APITestCase):
|
|
|
170
160
|
topic = TopicFactory(owner=UserFactory())
|
|
171
161
|
dataset = topic.datasets[0]
|
|
172
162
|
self.login()
|
|
173
|
-
response = self.delete(url_for(
|
|
163
|
+
response = self.delete(url_for("apiv2.topic_dataset", topic=topic, dataset=dataset))
|
|
174
164
|
assert response.status_code == 403
|
|
175
165
|
|
|
176
166
|
|
|
177
167
|
class TopicReusesAPITest(APITestCase):
|
|
178
168
|
def test_list(self):
|
|
179
169
|
topic = TopicFactory()
|
|
180
|
-
response = self.get(url_for(
|
|
170
|
+
response = self.get(url_for("apiv2.topic_reuses", topic=topic))
|
|
181
171
|
assert response.status_code == 200
|
|
182
|
-
data = response.json[
|
|
172
|
+
data = response.json["data"]
|
|
183
173
|
assert len(data) == 3
|
|
184
|
-
assert all(str(r.id) in (_r[
|
|
174
|
+
assert all(str(r.id) in (_r["id"] for _r in data) for r in topic.reuses)
|
|
185
175
|
|
|
186
176
|
def test_add_reuses(self):
|
|
187
177
|
owner = self.login()
|
|
188
178
|
topic = TopicFactory(owner=owner)
|
|
189
179
|
r1, r2 = ReuseFactory.create_batch(2)
|
|
190
|
-
response = self.post(
|
|
191
|
-
{
|
|
192
|
-
|
|
180
|
+
response = self.post(
|
|
181
|
+
url_for("apiv2.topic_reuses", topic=topic), [{"id": r1.id}, {"id": r2.id}]
|
|
182
|
+
)
|
|
193
183
|
assert response.status_code == 201
|
|
194
184
|
topic.reload()
|
|
195
185
|
assert len(topic.reuses) == 5
|
|
@@ -199,15 +189,13 @@ class TopicReusesAPITest(APITestCase):
|
|
|
199
189
|
owner = self.login()
|
|
200
190
|
topic = TopicFactory(owner=owner)
|
|
201
191
|
reuse = ReuseFactory()
|
|
202
|
-
response = self.post(
|
|
203
|
-
{
|
|
204
|
-
|
|
192
|
+
response = self.post(
|
|
193
|
+
url_for("apiv2.topic_reuses", topic=topic), [{"id": reuse.id}, {"id": reuse.id}]
|
|
194
|
+
)
|
|
205
195
|
assert response.status_code == 201
|
|
206
196
|
topic.reload()
|
|
207
197
|
assert len(topic.reuses) == 4
|
|
208
|
-
response = self.post(url_for(
|
|
209
|
-
{'id': reuse.id}
|
|
210
|
-
])
|
|
198
|
+
response = self.post(url_for("apiv2.topic_reuses", topic=topic), [{"id": reuse.id}])
|
|
211
199
|
assert response.status_code == 201
|
|
212
200
|
topic.reload()
|
|
213
201
|
assert len(topic.reuses) == 4
|
|
@@ -217,23 +205,17 @@ class TopicReusesAPITest(APITestCase):
|
|
|
217
205
|
topic = TopicFactory(owner=user)
|
|
218
206
|
reuse = ReuseFactory()
|
|
219
207
|
self.login()
|
|
220
|
-
response = self.post(url_for(
|
|
221
|
-
{'id': reuse.id}
|
|
222
|
-
])
|
|
208
|
+
response = self.post(url_for("apiv2.topic_reuses", topic=topic), [{"id": reuse.id}])
|
|
223
209
|
assert response.status_code == 403
|
|
224
210
|
|
|
225
211
|
def test_add_reuses_wrong_payload(self):
|
|
226
212
|
owner = self.login()
|
|
227
213
|
topic = TopicFactory(owner=owner)
|
|
228
|
-
response = self.post(url_for(
|
|
229
|
-
{'id': 'xxx'}
|
|
230
|
-
])
|
|
214
|
+
response = self.post(url_for("apiv2.topic_reuses", topic=topic), [{"id": "xxx"}])
|
|
231
215
|
assert response.status_code == 400
|
|
232
|
-
response = self.post(url_for(
|
|
233
|
-
{'nain': 'portekoi'}
|
|
234
|
-
])
|
|
216
|
+
response = self.post(url_for("apiv2.topic_reuses", topic=topic), [{"nain": "portekoi"}])
|
|
235
217
|
assert response.status_code == 400
|
|
236
|
-
response = self.post(url_for(
|
|
218
|
+
response = self.post(url_for("apiv2.topic_reuses", topic=topic), {"non": "mais"})
|
|
237
219
|
assert response.status_code == 400
|
|
238
220
|
|
|
239
221
|
|
|
@@ -242,7 +224,7 @@ class TopicReuseAPITest(APITestCase):
|
|
|
242
224
|
owner = self.login()
|
|
243
225
|
topic = TopicFactory(owner=owner)
|
|
244
226
|
reuse = topic.reuses[0]
|
|
245
|
-
response = self.delete(url_for(
|
|
227
|
+
response = self.delete(url_for("apiv2.topic_reuse", topic=topic, reuse=reuse))
|
|
246
228
|
assert response.status_code == 204
|
|
247
229
|
topic.reload()
|
|
248
230
|
assert len(topic.reuses) == 2
|
|
@@ -252,5 +234,5 @@ class TopicReuseAPITest(APITestCase):
|
|
|
252
234
|
topic = TopicFactory(owner=UserFactory())
|
|
253
235
|
reuse = topic.reuses[0]
|
|
254
236
|
self.login()
|
|
255
|
-
response = self.delete(url_for(
|
|
237
|
+
response = self.delete(url_for("apiv2.topic_reuse", topic=topic, reuse=reuse))
|
|
256
238
|
assert response.status_code == 403
|