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
|
@@ -1,30 +1,32 @@
|
|
|
1
|
-
import pytest
|
|
2
|
-
|
|
3
1
|
from datetime import datetime
|
|
4
2
|
|
|
3
|
+
import pytest
|
|
5
4
|
from flask import url_for
|
|
6
5
|
|
|
7
|
-
from udata.models import (
|
|
8
|
-
Organization, Member, MembershipRequest, Follow, Discussion
|
|
9
|
-
)
|
|
10
|
-
|
|
11
|
-
from udata.utils import faker
|
|
12
6
|
from udata.core.badges.factories import badge_factory
|
|
13
7
|
from udata.core.badges.signals import on_badge_added, on_badge_removed
|
|
14
|
-
from udata.core.organization.factories import OrganizationFactory
|
|
15
|
-
from udata.core.user.factories import UserFactory, AdminFactory
|
|
16
8
|
from udata.core.dataset.factories import DatasetFactory
|
|
9
|
+
from udata.core.organization.factories import OrganizationFactory
|
|
17
10
|
from udata.core.reuse.factories import ReuseFactory
|
|
11
|
+
from udata.core.user.factories import AdminFactory, UserFactory
|
|
18
12
|
from udata.i18n import _
|
|
19
|
-
|
|
13
|
+
from udata.models import Discussion, Follow, Member, MembershipRequest, Organization
|
|
20
14
|
from udata.tests.helpers import (
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
15
|
+
assert200,
|
|
16
|
+
assert201,
|
|
17
|
+
assert204,
|
|
18
|
+
assert400,
|
|
19
|
+
assert403,
|
|
20
|
+
assert404,
|
|
21
|
+
assert410,
|
|
22
|
+
assert_emit,
|
|
23
|
+
assert_not_emit,
|
|
24
|
+
assert_status,
|
|
24
25
|
)
|
|
26
|
+
from udata.utils import faker
|
|
25
27
|
|
|
26
28
|
pytestmark = [
|
|
27
|
-
pytest.mark.usefixtures(
|
|
29
|
+
pytest.mark.usefixtures("clean_db"),
|
|
28
30
|
]
|
|
29
31
|
|
|
30
32
|
|
|
@@ -32,152 +34,155 @@ class OrganizationAPITest:
|
|
|
32
34
|
modules = []
|
|
33
35
|
|
|
34
36
|
def test_organization_api_list(self, api):
|
|
35
|
-
|
|
37
|
+
"""It should fetch an organization list from the API"""
|
|
36
38
|
organizations = OrganizationFactory.create_batch(3)
|
|
37
39
|
|
|
38
|
-
response = api.get(url_for(
|
|
40
|
+
response = api.get(url_for("api.organizations"))
|
|
39
41
|
assert200(response)
|
|
40
|
-
len(response.json[
|
|
42
|
+
len(response.json["data"]) == len(organizations)
|
|
41
43
|
|
|
42
44
|
def test_organization_role_api_get(self, api):
|
|
43
|
-
|
|
44
|
-
response = api.get(url_for(
|
|
45
|
+
"""It should fetch an organization's roles list from the API"""
|
|
46
|
+
response = api.get(url_for("api.org_roles"))
|
|
45
47
|
assert200(response)
|
|
46
48
|
|
|
47
49
|
def test_organization_api_get(self, api):
|
|
48
|
-
|
|
50
|
+
"""It should fetch an organization from the API"""
|
|
49
51
|
organization = OrganizationFactory()
|
|
50
|
-
response = api.get(url_for(
|
|
52
|
+
response = api.get(url_for("api.organization", org=organization))
|
|
51
53
|
assert200(response)
|
|
52
54
|
|
|
53
55
|
def test_organization_api_get_deleted(self, api):
|
|
54
|
-
|
|
56
|
+
"""It should not fetch a deleted organization from the API"""
|
|
55
57
|
organization = OrganizationFactory(deleted=datetime.utcnow())
|
|
56
|
-
response = api.get(url_for(
|
|
58
|
+
response = api.get(url_for("api.organization", org=organization))
|
|
57
59
|
assert410(response)
|
|
58
60
|
|
|
59
61
|
def test_organization_api_get_deleted_but_authorized(self, api):
|
|
60
|
-
|
|
62
|
+
"""It should fetch a deleted organization from the API if authorized"""
|
|
61
63
|
user = api.login()
|
|
62
|
-
member = Member(user=user, role=
|
|
63
|
-
organization = OrganizationFactory(deleted=datetime.utcnow(),
|
|
64
|
-
|
|
65
|
-
response = api.get(url_for('api.organization', org=organization))
|
|
64
|
+
member = Member(user=user, role="editor")
|
|
65
|
+
organization = OrganizationFactory(deleted=datetime.utcnow(), members=[member])
|
|
66
|
+
response = api.get(url_for("api.organization", org=organization))
|
|
66
67
|
assert200(response)
|
|
67
68
|
|
|
68
69
|
def test_organization_api_create(self, api):
|
|
69
|
-
|
|
70
|
+
"""It should create an organization from the API"""
|
|
70
71
|
data = OrganizationFactory.as_dict()
|
|
71
72
|
user = api.login()
|
|
72
|
-
response = api.post(url_for(
|
|
73
|
+
response = api.post(url_for("api.organizations"), data)
|
|
73
74
|
assert201(response)
|
|
74
75
|
assert Organization.objects.count() is 1
|
|
75
76
|
|
|
76
77
|
org = Organization.objects.first()
|
|
77
78
|
member = org.member(user)
|
|
78
|
-
assert member is not None,
|
|
79
|
-
assert member.role ==
|
|
80
|
-
assert org.get_metrics()[
|
|
79
|
+
assert member is not None, "Current user should be a member"
|
|
80
|
+
assert member.role == "admin", "Current user should be an administrator"
|
|
81
|
+
assert org.get_metrics()["members"] == 1
|
|
81
82
|
|
|
82
83
|
def test_organization_api_update(self, api):
|
|
83
|
-
|
|
84
|
+
"""It should update an organization from the API"""
|
|
84
85
|
user = api.login()
|
|
85
|
-
member = Member(user=user, role=
|
|
86
|
+
member = Member(user=user, role="admin")
|
|
86
87
|
org = OrganizationFactory(members=[member])
|
|
87
88
|
data = org.to_dict()
|
|
88
|
-
data[
|
|
89
|
-
response = api.put(url_for(
|
|
89
|
+
data["description"] = "new description"
|
|
90
|
+
response = api.put(url_for("api.organization", org=org), data)
|
|
90
91
|
assert200(response)
|
|
91
92
|
assert Organization.objects.count() is 1
|
|
92
|
-
assert Organization.objects.first().description ==
|
|
93
|
+
assert Organization.objects.first().description == "new description"
|
|
93
94
|
|
|
94
95
|
def test_organization_api_update_business_number_id(self, api):
|
|
95
|
-
|
|
96
|
+
"""It should update an organization from the API by adding a business number id"""
|
|
96
97
|
user = api.login()
|
|
97
|
-
member = Member(user=user, role=
|
|
98
|
+
member = Member(user=user, role="admin")
|
|
98
99
|
org = OrganizationFactory(members=[member])
|
|
99
100
|
data = org.to_dict()
|
|
100
|
-
data[
|
|
101
|
-
response = api.put(url_for(
|
|
101
|
+
data["business_number_id"] = "13002526500013"
|
|
102
|
+
response = api.put(url_for("api.organization", org=org), data)
|
|
102
103
|
assert200(response)
|
|
103
104
|
assert Organization.objects.count() is 1
|
|
104
|
-
assert Organization.objects.first().business_number_id ==
|
|
105
|
+
assert Organization.objects.first().business_number_id == "13002526500013"
|
|
105
106
|
|
|
106
107
|
def test_organization_api_update_business_number_id_failing(self, api):
|
|
107
|
-
|
|
108
|
+
"""It should update an organization from the API by adding a business number id"""
|
|
108
109
|
user = api.login()
|
|
109
|
-
member = Member(user=user, role=
|
|
110
|
+
member = Member(user=user, role="admin")
|
|
110
111
|
org = OrganizationFactory(members=[member])
|
|
111
112
|
data = org.to_dict()
|
|
112
|
-
data[
|
|
113
|
-
response = api.put(url_for(
|
|
113
|
+
data["business_number_id"] = "110014016"
|
|
114
|
+
response = api.put(url_for("api.organization", org=org), data)
|
|
114
115
|
assert400(response)
|
|
115
|
-
assert response.json[
|
|
116
|
+
assert response.json["errors"]["business_number_id"][0] == _(
|
|
117
|
+
"A siret number is made of 14 digits"
|
|
118
|
+
)
|
|
116
119
|
|
|
117
|
-
data[
|
|
118
|
-
response = api.put(url_for(
|
|
120
|
+
data["business_number_id"] = "12345678901234"
|
|
121
|
+
response = api.put(url_for("api.organization", org=org), data)
|
|
119
122
|
assert400(response)
|
|
120
|
-
assert response.json[
|
|
123
|
+
assert response.json["errors"]["business_number_id"][0] == _("Invalid Siret number")
|
|
121
124
|
|
|
122
|
-
data[
|
|
123
|
-
response = api.put(url_for(
|
|
125
|
+
data["business_number_id"] = "tttttttttttttt"
|
|
126
|
+
response = api.put(url_for("api.organization", org=org), data)
|
|
124
127
|
assert400(response)
|
|
125
|
-
assert response.json[
|
|
128
|
+
assert response.json["errors"]["business_number_id"][0] == _(
|
|
129
|
+
"A siret number is only made of digits"
|
|
130
|
+
)
|
|
126
131
|
|
|
127
132
|
def test_organization_api_update_deleted(self, api):
|
|
128
|
-
|
|
133
|
+
"""It should not update a deleted organization from the API"""
|
|
129
134
|
org = OrganizationFactory(deleted=datetime.utcnow())
|
|
130
135
|
data = org.to_dict()
|
|
131
|
-
data[
|
|
136
|
+
data["description"] = "new description"
|
|
132
137
|
api.login()
|
|
133
|
-
response = api.put(url_for(
|
|
138
|
+
response = api.put(url_for("api.organization", org=org), data)
|
|
134
139
|
assert410(response)
|
|
135
140
|
assert Organization.objects.first().description == org.description
|
|
136
141
|
|
|
137
142
|
def test_organization_api_update_forbidden(self, api):
|
|
138
|
-
|
|
143
|
+
"""It should not update an organization from the API if not admin"""
|
|
139
144
|
org = OrganizationFactory()
|
|
140
145
|
data = org.to_dict()
|
|
141
|
-
data[
|
|
146
|
+
data["description"] = "new description"
|
|
142
147
|
api.login()
|
|
143
|
-
response = api.put(url_for(
|
|
148
|
+
response = api.put(url_for("api.organization", org=org), data)
|
|
144
149
|
assert403(response)
|
|
145
150
|
assert Organization.objects.count() is 1
|
|
146
151
|
assert Organization.objects.first().description == org.description
|
|
147
152
|
|
|
148
153
|
def test_organization_api_delete(self, api):
|
|
149
|
-
|
|
154
|
+
"""It should delete an organization from the API"""
|
|
150
155
|
user = api.login()
|
|
151
|
-
member = Member(user=user, role=
|
|
156
|
+
member = Member(user=user, role="admin")
|
|
152
157
|
org = OrganizationFactory(members=[member])
|
|
153
|
-
response = api.delete(url_for(
|
|
158
|
+
response = api.delete(url_for("api.organization", org=org))
|
|
154
159
|
assert204(response)
|
|
155
160
|
assert Organization.objects.count() is 1
|
|
156
161
|
assert Organization.objects[0].deleted is not None
|
|
157
162
|
|
|
158
163
|
def test_organization_api_delete_deleted(self, api):
|
|
159
|
-
|
|
164
|
+
"""It should not delete a deleted organization from the API"""
|
|
160
165
|
api.login()
|
|
161
166
|
organization = OrganizationFactory(deleted=datetime.utcnow())
|
|
162
|
-
response = api.delete(url_for(
|
|
167
|
+
response = api.delete(url_for("api.organization", org=organization))
|
|
163
168
|
assert410(response)
|
|
164
169
|
assert Organization.objects[0].deleted is not None
|
|
165
170
|
|
|
166
171
|
def test_organization_api_delete_as_editor_forbidden(self, api):
|
|
167
|
-
|
|
172
|
+
"""It should not delete an organization from the API if not admin"""
|
|
168
173
|
user = api.login()
|
|
169
|
-
member = Member(user=user, role=
|
|
174
|
+
member = Member(user=user, role="editor")
|
|
170
175
|
org = OrganizationFactory(members=[member])
|
|
171
|
-
response = api.delete(url_for(
|
|
176
|
+
response = api.delete(url_for("api.organization", org=org))
|
|
172
177
|
assert403(response)
|
|
173
178
|
assert Organization.objects.count() is 1
|
|
174
179
|
assert Organization.objects[0].deleted is None
|
|
175
180
|
|
|
176
181
|
def test_organization_api_delete_as_non_member_forbidden(self, api):
|
|
177
|
-
|
|
182
|
+
"""It should delete an organization from the API if not member"""
|
|
178
183
|
api.login()
|
|
179
184
|
org = OrganizationFactory()
|
|
180
|
-
response = api.delete(url_for(
|
|
185
|
+
response = api.delete(url_for("api.organization", org=org))
|
|
181
186
|
assert403(response)
|
|
182
187
|
assert Organization.objects.count() is 1
|
|
183
188
|
assert Organization.objects[0].deleted is None
|
|
@@ -189,9 +194,9 @@ class MembershipAPITest:
|
|
|
189
194
|
def test_request_membership(self, api):
|
|
190
195
|
organization = OrganizationFactory()
|
|
191
196
|
user = api.login()
|
|
192
|
-
data = {
|
|
197
|
+
data = {"comment": "a comment"}
|
|
193
198
|
|
|
194
|
-
response = api.post(url_for(
|
|
199
|
+
response = api.post(url_for("api.request_membership", org=organization), data)
|
|
195
200
|
assert201(response)
|
|
196
201
|
|
|
197
202
|
organization.reload()
|
|
@@ -202,19 +207,19 @@ class MembershipAPITest:
|
|
|
202
207
|
|
|
203
208
|
request = organization.requests[0]
|
|
204
209
|
assert request.user == user
|
|
205
|
-
assert request.status ==
|
|
206
|
-
assert request.comment ==
|
|
210
|
+
assert request.status == "pending"
|
|
211
|
+
assert request.comment == "a comment"
|
|
207
212
|
assert request.handled_on is None
|
|
208
213
|
assert request.handled_by is None
|
|
209
214
|
assert request.refusal_comment is None
|
|
210
215
|
|
|
211
216
|
def test_request_existing_pending_membership_do_not_duplicate_it(self, api):
|
|
212
217
|
user = api.login()
|
|
213
|
-
previous_request = MembershipRequest(user=user, comment=
|
|
218
|
+
previous_request = MembershipRequest(user=user, comment="previous")
|
|
214
219
|
organization = OrganizationFactory(requests=[previous_request])
|
|
215
|
-
data = {
|
|
220
|
+
data = {"comment": "a comment"}
|
|
216
221
|
|
|
217
|
-
response = api.post(url_for(
|
|
222
|
+
response = api.post(url_for("api.request_membership", org=organization), data)
|
|
218
223
|
assert200(response)
|
|
219
224
|
|
|
220
225
|
organization.reload()
|
|
@@ -225,8 +230,8 @@ class MembershipAPITest:
|
|
|
225
230
|
|
|
226
231
|
request = organization.requests[0]
|
|
227
232
|
assert request.user == user
|
|
228
|
-
assert request.status ==
|
|
229
|
-
assert request.comment ==
|
|
233
|
+
assert request.status == "pending"
|
|
234
|
+
assert request.comment == "a comment"
|
|
230
235
|
assert request.handled_on is None
|
|
231
236
|
assert request.handled_by is None
|
|
232
237
|
assert request.refusal_comment is None
|
|
@@ -234,94 +239,91 @@ class MembershipAPITest:
|
|
|
234
239
|
def test_get_membership_requests(self, api):
|
|
235
240
|
user = api.login()
|
|
236
241
|
applicant = UserFactory(email="thibaud@example.org")
|
|
237
|
-
membership_request = MembershipRequest(user=applicant, comment=
|
|
238
|
-
member = Member(user=user, role=
|
|
239
|
-
organization = OrganizationFactory(
|
|
240
|
-
members=[member], requests=[membership_request])
|
|
242
|
+
membership_request = MembershipRequest(user=applicant, comment="test")
|
|
243
|
+
member = Member(user=user, role="admin")
|
|
244
|
+
organization = OrganizationFactory(members=[member], requests=[membership_request])
|
|
241
245
|
|
|
242
|
-
response = api.get(url_for(
|
|
246
|
+
response = api.get(url_for("api.request_membership", org=organization))
|
|
243
247
|
assert200(response)
|
|
244
248
|
|
|
245
249
|
assert len(response.json) == 1
|
|
246
|
-
assert response.json[0][
|
|
247
|
-
assert
|
|
250
|
+
assert response.json[0]["comment"] == "test"
|
|
251
|
+
assert (
|
|
252
|
+
response.json[0]["user"]["email"] == "thibaud@example.org"
|
|
253
|
+
) # Can see email of applicant
|
|
248
254
|
|
|
249
255
|
def test_only_org_member_can_get_membership_requests(self, api):
|
|
250
256
|
api.login()
|
|
251
257
|
applicant = UserFactory(email="thibaud@example.org")
|
|
252
|
-
membership_request = MembershipRequest(user=applicant, comment=
|
|
253
|
-
organization = OrganizationFactory(
|
|
254
|
-
members=[], requests=[membership_request])
|
|
258
|
+
membership_request = MembershipRequest(user=applicant, comment="test")
|
|
259
|
+
organization = OrganizationFactory(members=[], requests=[membership_request])
|
|
255
260
|
|
|
256
|
-
response = api.get(url_for(
|
|
261
|
+
response = api.get(url_for("api.request_membership", org=organization))
|
|
257
262
|
assert403(response)
|
|
258
263
|
|
|
259
|
-
|
|
260
264
|
def test_get_members_with_or_without_email(self, api):
|
|
261
|
-
admin = Member(
|
|
262
|
-
|
|
265
|
+
admin = Member(
|
|
266
|
+
user=UserFactory(email="admin@example.org"), role="admin", since="2024-04-14"
|
|
267
|
+
)
|
|
268
|
+
editor = Member(user=UserFactory(email="editor@example.org"), role="editor")
|
|
263
269
|
other = UserFactory(email="other@example.org")
|
|
264
270
|
|
|
265
271
|
organization = OrganizationFactory(members=[admin, editor])
|
|
266
272
|
|
|
267
273
|
# Admin can see emails
|
|
268
274
|
api.login(admin.user)
|
|
269
|
-
response = api.get(url_for(
|
|
275
|
+
response = api.get(url_for("api.organization", org=organization))
|
|
270
276
|
assert200(response)
|
|
271
277
|
|
|
272
|
-
members = response.json[
|
|
278
|
+
members = response.json["members"]
|
|
273
279
|
assert len(members) == 2
|
|
274
|
-
assert members[0][
|
|
275
|
-
assert members[0][
|
|
276
|
-
assert members[0][
|
|
280
|
+
assert members[0]["role"] == "admin"
|
|
281
|
+
assert members[0]["since"] == "2024-04-14T00:00:00+00:00"
|
|
282
|
+
assert members[0]["user"]["email"] == "admin@example.org"
|
|
277
283
|
|
|
278
|
-
assert members[1][
|
|
279
|
-
assert members[1][
|
|
284
|
+
assert members[1]["role"] == "editor"
|
|
285
|
+
assert members[1]["user"]["email"] == "editor@example.org"
|
|
280
286
|
|
|
281
287
|
# Editor can see emails
|
|
282
288
|
api.login(editor.user)
|
|
283
|
-
response = api.get(url_for(
|
|
289
|
+
response = api.get(url_for("api.organization", org=organization))
|
|
284
290
|
assert200(response)
|
|
285
291
|
|
|
286
|
-
members = response.json[
|
|
292
|
+
members = response.json["members"]
|
|
287
293
|
assert len(members) == 2
|
|
288
|
-
assert members[0][
|
|
289
|
-
assert members[0][
|
|
290
|
-
assert members[0][
|
|
294
|
+
assert members[0]["role"] == "admin"
|
|
295
|
+
assert members[0]["since"] == "2024-04-14T00:00:00+00:00"
|
|
296
|
+
assert members[0]["user"]["email"] == "admin@example.org"
|
|
297
|
+
|
|
298
|
+
assert members[1]["role"] == "editor"
|
|
299
|
+
assert members[1]["user"]["email"] == "editor@example.org"
|
|
291
300
|
|
|
292
|
-
assert members[1]['role'] == 'editor'
|
|
293
|
-
assert members[1]['user']['email'] == 'editor@example.org'
|
|
294
|
-
|
|
295
301
|
# Others cannot see emails
|
|
296
302
|
api.login(other)
|
|
297
|
-
response = api.get(url_for(
|
|
303
|
+
response = api.get(url_for("api.organization", org=organization))
|
|
298
304
|
assert200(response)
|
|
299
305
|
|
|
300
|
-
members = response.json[
|
|
306
|
+
members = response.json["members"]
|
|
301
307
|
assert len(members) == 2
|
|
302
|
-
assert members[0][
|
|
303
|
-
assert members[0][
|
|
304
|
-
assert members[0][
|
|
308
|
+
assert members[0]["role"] == "admin"
|
|
309
|
+
assert members[0]["since"] == "2024-04-14T00:00:00+00:00"
|
|
310
|
+
assert members[0]["user"]["email"] is None
|
|
305
311
|
|
|
306
|
-
assert members[1][
|
|
307
|
-
assert members[1][
|
|
312
|
+
assert members[1]["role"] == "editor"
|
|
313
|
+
assert members[1]["user"]["email"] is None
|
|
308
314
|
|
|
309
315
|
def test_accept_membership(self, api):
|
|
310
316
|
user = api.login()
|
|
311
317
|
applicant = UserFactory()
|
|
312
|
-
membership_request = MembershipRequest(user=applicant, comment=
|
|
313
|
-
member = Member(user=user, role=
|
|
314
|
-
organization = OrganizationFactory(
|
|
315
|
-
members=[member], requests=[membership_request])
|
|
318
|
+
membership_request = MembershipRequest(user=applicant, comment="test")
|
|
319
|
+
member = Member(user=user, role="admin")
|
|
320
|
+
organization = OrganizationFactory(members=[member], requests=[membership_request])
|
|
316
321
|
|
|
317
|
-
api_url = url_for(
|
|
318
|
-
'api.accept_membership',
|
|
319
|
-
org=organization,
|
|
320
|
-
id=membership_request.id)
|
|
322
|
+
api_url = url_for("api.accept_membership", org=organization, id=membership_request.id)
|
|
321
323
|
response = api.post(api_url)
|
|
322
324
|
assert200(response)
|
|
323
325
|
|
|
324
|
-
assert response.json[
|
|
326
|
+
assert response.json["role"] == "editor"
|
|
325
327
|
|
|
326
328
|
organization.reload()
|
|
327
329
|
assert len(organization.requests) is 1
|
|
@@ -332,62 +334,48 @@ class MembershipAPITest:
|
|
|
332
334
|
|
|
333
335
|
request = organization.requests[0]
|
|
334
336
|
assert request.user == applicant
|
|
335
|
-
assert request.status ==
|
|
336
|
-
assert request.comment ==
|
|
337
|
+
assert request.status == "accepted"
|
|
338
|
+
assert request.comment == "test"
|
|
337
339
|
assert request.handled_by == user
|
|
338
340
|
assert request.handled_on is not None
|
|
339
341
|
assert request.refusal_comment is None
|
|
340
342
|
|
|
341
343
|
# test accepting twice will raise 409
|
|
342
|
-
api_url = url_for(
|
|
343
|
-
'api.accept_membership',
|
|
344
|
-
org=organization,
|
|
345
|
-
id=membership_request.id)
|
|
344
|
+
api_url = url_for("api.accept_membership", org=organization, id=membership_request.id)
|
|
346
345
|
response = api.post(api_url)
|
|
347
346
|
assert_status(response, 409)
|
|
348
347
|
|
|
349
348
|
def test_only_admin_can_accept_membership(self, api):
|
|
350
349
|
user = api.login()
|
|
351
350
|
applicant = UserFactory()
|
|
352
|
-
membership_request = MembershipRequest(user=applicant, comment=
|
|
353
|
-
member = Member(user=user, role=
|
|
354
|
-
organization = OrganizationFactory(
|
|
355
|
-
members=[member], requests=[membership_request])
|
|
351
|
+
membership_request = MembershipRequest(user=applicant, comment="test")
|
|
352
|
+
member = Member(user=user, role="editor")
|
|
353
|
+
organization = OrganizationFactory(members=[member], requests=[membership_request])
|
|
356
354
|
|
|
357
|
-
api_url = url_for(
|
|
358
|
-
'api.accept_membership',
|
|
359
|
-
org=organization,
|
|
360
|
-
id=membership_request.id)
|
|
355
|
+
api_url = url_for("api.accept_membership", org=organization, id=membership_request.id)
|
|
361
356
|
response = api.post(api_url)
|
|
362
357
|
assert403(response)
|
|
363
358
|
|
|
364
359
|
def test_accept_membership_404(self, api):
|
|
365
360
|
user = api.login()
|
|
366
|
-
member = Member(user=user, role=
|
|
361
|
+
member = Member(user=user, role="admin")
|
|
367
362
|
organization = OrganizationFactory(members=[member])
|
|
368
363
|
|
|
369
|
-
api_url = url_for(
|
|
370
|
-
'api.accept_membership',
|
|
371
|
-
org=organization,
|
|
372
|
-
id=MembershipRequest().id)
|
|
364
|
+
api_url = url_for("api.accept_membership", org=organization, id=MembershipRequest().id)
|
|
373
365
|
response = api.post(api_url)
|
|
374
366
|
assert404(response)
|
|
375
367
|
|
|
376
|
-
assert response.json[
|
|
368
|
+
assert response.json["message"] == "Unknown membership request id"
|
|
377
369
|
|
|
378
370
|
def test_refuse_membership(self, api):
|
|
379
371
|
user = api.login()
|
|
380
372
|
applicant = UserFactory()
|
|
381
|
-
membership_request = MembershipRequest(user=applicant, comment=
|
|
382
|
-
member = Member(user=user, role=
|
|
383
|
-
organization = OrganizationFactory(
|
|
384
|
-
|
|
385
|
-
data = {'comment': 'no'}
|
|
373
|
+
membership_request = MembershipRequest(user=applicant, comment="test")
|
|
374
|
+
member = Member(user=user, role="admin")
|
|
375
|
+
organization = OrganizationFactory(members=[member], requests=[membership_request])
|
|
376
|
+
data = {"comment": "no"}
|
|
386
377
|
|
|
387
|
-
api_url = url_for(
|
|
388
|
-
'api.refuse_membership',
|
|
389
|
-
org=organization,
|
|
390
|
-
id=membership_request.id)
|
|
378
|
+
api_url = url_for("api.refuse_membership", org=organization, id=membership_request.id)
|
|
391
379
|
response = api.post(api_url, data)
|
|
392
380
|
assert200(response)
|
|
393
381
|
|
|
@@ -400,70 +388,67 @@ class MembershipAPITest:
|
|
|
400
388
|
|
|
401
389
|
request = organization.requests[0]
|
|
402
390
|
assert request.user == applicant
|
|
403
|
-
assert request.status ==
|
|
404
|
-
assert request.comment ==
|
|
405
|
-
assert request.refusal_comment ==
|
|
391
|
+
assert request.status == "refused"
|
|
392
|
+
assert request.comment == "test"
|
|
393
|
+
assert request.refusal_comment == "no"
|
|
406
394
|
assert request.handled_by == user
|
|
407
395
|
assert request.handled_on is not None
|
|
408
396
|
|
|
409
397
|
def test_only_admin_can_refuse_membership(self, api):
|
|
410
398
|
user = api.login()
|
|
411
399
|
applicant = UserFactory()
|
|
412
|
-
membership_request = MembershipRequest(user=applicant, comment=
|
|
413
|
-
member = Member(user=user, role=
|
|
414
|
-
organization = OrganizationFactory(
|
|
415
|
-
|
|
416
|
-
data = {'comment': 'no'}
|
|
400
|
+
membership_request = MembershipRequest(user=applicant, comment="test")
|
|
401
|
+
member = Member(user=user, role="editor")
|
|
402
|
+
organization = OrganizationFactory(members=[member], requests=[membership_request])
|
|
403
|
+
data = {"comment": "no"}
|
|
417
404
|
|
|
418
|
-
api_url = url_for(
|
|
419
|
-
'api.refuse_membership',
|
|
420
|
-
org=organization,
|
|
421
|
-
id=membership_request.id)
|
|
405
|
+
api_url = url_for("api.refuse_membership", org=organization, id=membership_request.id)
|
|
422
406
|
response = api.post(api_url, data)
|
|
423
407
|
assert403(response)
|
|
424
408
|
|
|
425
409
|
def test_refuse_membership_404(self, api):
|
|
426
410
|
user = api.login()
|
|
427
|
-
member = Member(user=user, role=
|
|
411
|
+
member = Member(user=user, role="admin")
|
|
428
412
|
organization = OrganizationFactory(members=[member])
|
|
429
413
|
|
|
430
|
-
api_url = url_for(
|
|
431
|
-
'api.refuse_membership',
|
|
432
|
-
org=organization,
|
|
433
|
-
id=MembershipRequest().id)
|
|
414
|
+
api_url = url_for("api.refuse_membership", org=organization, id=MembershipRequest().id)
|
|
434
415
|
response = api.post(api_url)
|
|
435
416
|
assert404(response)
|
|
436
417
|
|
|
437
|
-
assert response.json[
|
|
418
|
+
assert response.json["message"] == "Unknown membership request id"
|
|
438
419
|
|
|
439
420
|
def test_create_member(self, api):
|
|
440
421
|
user = api.login()
|
|
441
422
|
added_user = UserFactory()
|
|
442
|
-
organization = OrganizationFactory(
|
|
443
|
-
|
|
444
|
-
|
|
423
|
+
organization = OrganizationFactory(
|
|
424
|
+
members=[
|
|
425
|
+
Member(user=user, role="admin"),
|
|
426
|
+
]
|
|
427
|
+
)
|
|
445
428
|
|
|
446
|
-
api_url = url_for(
|
|
447
|
-
response = api.post(api_url, {
|
|
429
|
+
api_url = url_for("api.member", org=organization, user=added_user)
|
|
430
|
+
response = api.post(api_url, {"role": "admin"})
|
|
448
431
|
|
|
449
432
|
assert201(response)
|
|
450
433
|
|
|
451
|
-
assert response.json[
|
|
434
|
+
assert response.json["role"] == "admin"
|
|
452
435
|
|
|
453
436
|
organization.reload()
|
|
454
437
|
assert organization.is_member(added_user)
|
|
455
438
|
assert organization.is_admin(added_user)
|
|
456
|
-
assert organization.get_metrics()[
|
|
439
|
+
assert organization.get_metrics()["members"] == 2
|
|
457
440
|
|
|
458
441
|
def test_only_admin_can_create_member(self, api):
|
|
459
442
|
user = api.login()
|
|
460
443
|
added_user = UserFactory()
|
|
461
|
-
organization = OrganizationFactory(
|
|
462
|
-
|
|
463
|
-
|
|
444
|
+
organization = OrganizationFactory(
|
|
445
|
+
members=[
|
|
446
|
+
Member(user=user, role="editor"),
|
|
447
|
+
]
|
|
448
|
+
)
|
|
464
449
|
|
|
465
|
-
api_url = url_for(
|
|
466
|
-
response = api.post(api_url, {
|
|
450
|
+
api_url = url_for("api.member", org=organization, user=added_user)
|
|
451
|
+
response = api.post(api_url, {"role": "editor"})
|
|
467
452
|
|
|
468
453
|
assert403(response)
|
|
469
454
|
|
|
@@ -473,17 +458,16 @@ class MembershipAPITest:
|
|
|
473
458
|
def test_create_member_exists(self, api):
|
|
474
459
|
user = api.login()
|
|
475
460
|
added_user = UserFactory()
|
|
476
|
-
organization = OrganizationFactory(
|
|
477
|
-
Member(user=user, role=
|
|
478
|
-
|
|
479
|
-
])
|
|
461
|
+
organization = OrganizationFactory(
|
|
462
|
+
members=[Member(user=user, role="admin"), Member(user=added_user, role="editor")]
|
|
463
|
+
)
|
|
480
464
|
|
|
481
|
-
api_url = url_for(
|
|
482
|
-
response = api.post(api_url, {
|
|
465
|
+
api_url = url_for("api.member", org=organization, user=added_user)
|
|
466
|
+
response = api.post(api_url, {"role": "admin"})
|
|
483
467
|
|
|
484
468
|
assert_status(response, 409)
|
|
485
469
|
|
|
486
|
-
assert response.json[
|
|
470
|
+
assert response.json["role"] == "editor"
|
|
487
471
|
|
|
488
472
|
organization.reload()
|
|
489
473
|
assert organization.is_member(added_user)
|
|
@@ -492,17 +476,16 @@ class MembershipAPITest:
|
|
|
492
476
|
def test_update_member(self, api):
|
|
493
477
|
user = api.login()
|
|
494
478
|
updated_user = UserFactory()
|
|
495
|
-
organization = OrganizationFactory(
|
|
496
|
-
Member(user=user, role=
|
|
497
|
-
|
|
498
|
-
])
|
|
479
|
+
organization = OrganizationFactory(
|
|
480
|
+
members=[Member(user=user, role="admin"), Member(user=updated_user, role="editor")]
|
|
481
|
+
)
|
|
499
482
|
|
|
500
|
-
api_url = url_for(
|
|
501
|
-
response = api.put(api_url, {
|
|
483
|
+
api_url = url_for("api.member", org=organization, user=updated_user)
|
|
484
|
+
response = api.put(api_url, {"role": "admin"})
|
|
502
485
|
|
|
503
486
|
assert200(response)
|
|
504
487
|
|
|
505
|
-
assert response.json[
|
|
488
|
+
assert response.json["role"] == "admin"
|
|
506
489
|
|
|
507
490
|
organization.reload()
|
|
508
491
|
assert organization.is_member(updated_user)
|
|
@@ -511,13 +494,12 @@ class MembershipAPITest:
|
|
|
511
494
|
def test_only_admin_can_update_member(self, api):
|
|
512
495
|
user = api.login()
|
|
513
496
|
updated_user = UserFactory()
|
|
514
|
-
organization = OrganizationFactory(
|
|
515
|
-
Member(user=user, role=
|
|
516
|
-
|
|
517
|
-
])
|
|
497
|
+
organization = OrganizationFactory(
|
|
498
|
+
members=[Member(user=user, role="editor"), Member(user=updated_user, role="editor")]
|
|
499
|
+
)
|
|
518
500
|
|
|
519
|
-
api_url = url_for(
|
|
520
|
-
response = api.put(api_url, {
|
|
501
|
+
api_url = url_for("api.member", org=organization, user=updated_user)
|
|
502
|
+
response = api.put(api_url, {"role": "admin"})
|
|
521
503
|
|
|
522
504
|
assert403(response)
|
|
523
505
|
|
|
@@ -528,28 +510,26 @@ class MembershipAPITest:
|
|
|
528
510
|
def test_delete_member(self, api):
|
|
529
511
|
user = api.login()
|
|
530
512
|
deleted_user = UserFactory()
|
|
531
|
-
organization = OrganizationFactory(
|
|
532
|
-
Member(user=user, role=
|
|
533
|
-
|
|
534
|
-
])
|
|
513
|
+
organization = OrganizationFactory(
|
|
514
|
+
members=[Member(user=user, role="admin"), Member(user=deleted_user, role="editor")]
|
|
515
|
+
)
|
|
535
516
|
|
|
536
|
-
api_url = url_for(
|
|
517
|
+
api_url = url_for("api.member", org=organization, user=deleted_user)
|
|
537
518
|
response = api.delete(api_url)
|
|
538
519
|
assert204(response)
|
|
539
520
|
|
|
540
521
|
organization.reload()
|
|
541
522
|
assert not organization.is_member(deleted_user)
|
|
542
|
-
assert organization.get_metrics()[
|
|
523
|
+
assert organization.get_metrics()["members"] == 1
|
|
543
524
|
|
|
544
525
|
def test_only_admin_can_delete_member(self, api):
|
|
545
526
|
user = api.login()
|
|
546
527
|
deleted_user = UserFactory()
|
|
547
|
-
organization = OrganizationFactory(
|
|
548
|
-
Member(user=user, role=
|
|
549
|
-
|
|
550
|
-
])
|
|
528
|
+
organization = OrganizationFactory(
|
|
529
|
+
members=[Member(user=user, role="editor"), Member(user=deleted_user, role="editor")]
|
|
530
|
+
)
|
|
551
531
|
|
|
552
|
-
api_url = url_for(
|
|
532
|
+
api_url = url_for("api.member", org=organization, user=deleted_user)
|
|
553
533
|
response = api.delete(api_url)
|
|
554
534
|
assert403(response)
|
|
555
535
|
|
|
@@ -557,16 +537,16 @@ class MembershipAPITest:
|
|
|
557
537
|
assert organization.is_member(deleted_user)
|
|
558
538
|
|
|
559
539
|
def test_follow_org(self, api):
|
|
560
|
-
|
|
540
|
+
"""It should follow an organization on POST"""
|
|
561
541
|
user = api.login()
|
|
562
542
|
to_follow = OrganizationFactory()
|
|
563
543
|
|
|
564
|
-
url = url_for(
|
|
544
|
+
url = url_for("api.organization_followers", id=to_follow.id)
|
|
565
545
|
response = api.post(url)
|
|
566
546
|
assert201(response)
|
|
567
547
|
|
|
568
548
|
to_follow.count_followers()
|
|
569
|
-
assert to_follow.get_metrics()[
|
|
549
|
+
assert to_follow.get_metrics()["followers"] == 1
|
|
570
550
|
|
|
571
551
|
assert Follow.objects.following(to_follow).count() is 0
|
|
572
552
|
assert Follow.objects.followers(to_follow).count() is 1
|
|
@@ -576,250 +556,234 @@ class MembershipAPITest:
|
|
|
576
556
|
assert Follow.objects.followers(user).count() is 0
|
|
577
557
|
|
|
578
558
|
def test_unfollow_org(self, api):
|
|
579
|
-
|
|
559
|
+
"""It should unfollow the organization on DELETE"""
|
|
580
560
|
user = api.login()
|
|
581
561
|
to_follow = OrganizationFactory()
|
|
582
562
|
Follow.objects.create(follower=user, following=to_follow)
|
|
583
563
|
|
|
584
|
-
url = url_for(
|
|
564
|
+
url = url_for("api.organization_followers", id=to_follow.id)
|
|
585
565
|
response = api.delete(url)
|
|
586
566
|
assert200(response)
|
|
587
567
|
|
|
588
568
|
nb_followers = Follow.objects.followers(to_follow).count()
|
|
589
569
|
|
|
590
570
|
assert nb_followers is 0
|
|
591
|
-
assert response.json[
|
|
571
|
+
assert response.json["followers"] == nb_followers
|
|
592
572
|
|
|
593
573
|
assert Follow.objects.following(to_follow).count() is 0
|
|
594
574
|
assert Follow.objects.following(user).count() is 0
|
|
595
575
|
assert Follow.objects.followers(user).count() is 0
|
|
596
576
|
|
|
597
577
|
def test_suggest_organizations_api(self, api):
|
|
598
|
-
|
|
578
|
+
"""It should suggest organizations"""
|
|
599
579
|
for i in range(3):
|
|
600
580
|
OrganizationFactory(
|
|
601
|
-
name=
|
|
602
|
-
|
|
603
|
-
max_follower_organization = OrganizationFactory(
|
|
604
|
-
|
|
605
|
-
metrics={"followers": 10}
|
|
606
|
-
)
|
|
607
|
-
response = api.get(url_for('api.suggest_organizations'),
|
|
608
|
-
qs={'q': 'tes', 'size': '5'})
|
|
581
|
+
name="test-{0}".format(i) if i % 2 else faker.word(), metrics={"followers": i}
|
|
582
|
+
)
|
|
583
|
+
max_follower_organization = OrganizationFactory(name="test-4", metrics={"followers": 10})
|
|
584
|
+
response = api.get(url_for("api.suggest_organizations"), qs={"q": "tes", "size": "5"})
|
|
609
585
|
assert200(response)
|
|
610
586
|
|
|
611
587
|
assert len(response.json) <= 5
|
|
612
588
|
assert len(response.json) > 1
|
|
613
589
|
|
|
614
590
|
for suggestion in response.json:
|
|
615
|
-
assert
|
|
616
|
-
assert
|
|
617
|
-
assert
|
|
618
|
-
assert
|
|
619
|
-
assert
|
|
620
|
-
assert
|
|
621
|
-
assert response.json[0][
|
|
591
|
+
assert "id" in suggestion
|
|
592
|
+
assert "slug" in suggestion
|
|
593
|
+
assert "name" in suggestion
|
|
594
|
+
assert "image_url" in suggestion
|
|
595
|
+
assert "acronym" in suggestion
|
|
596
|
+
assert "tes" in suggestion["name"]
|
|
597
|
+
assert response.json[0]["id"] == str(max_follower_organization.id)
|
|
622
598
|
|
|
623
599
|
def test_suggest_organizations_with_special_chars(self, api):
|
|
624
|
-
|
|
600
|
+
"""It should suggest organizations with special caracters"""
|
|
625
601
|
for i in range(4):
|
|
626
|
-
OrganizationFactory(
|
|
627
|
-
name='testé-{0}'.format(i) if i % 2 else faker.word())
|
|
602
|
+
OrganizationFactory(name="testé-{0}".format(i) if i % 2 else faker.word())
|
|
628
603
|
|
|
629
|
-
response = api.get(url_for(
|
|
630
|
-
qs={'q': 'testé', 'size': '5'})
|
|
604
|
+
response = api.get(url_for("api.suggest_organizations"), qs={"q": "testé", "size": "5"})
|
|
631
605
|
assert200(response)
|
|
632
606
|
|
|
633
607
|
assert len(response.json) <= 5
|
|
634
608
|
assert len(response.json) > 1
|
|
635
609
|
|
|
636
610
|
for suggestion in response.json:
|
|
637
|
-
assert
|
|
638
|
-
assert
|
|
639
|
-
assert
|
|
640
|
-
assert
|
|
641
|
-
assert
|
|
611
|
+
assert "id" in suggestion
|
|
612
|
+
assert "slug" in suggestion
|
|
613
|
+
assert "name" in suggestion
|
|
614
|
+
assert "image_url" in suggestion
|
|
615
|
+
assert "testé" in suggestion["name"]
|
|
642
616
|
|
|
643
617
|
def test_suggest_organizations_with_multiple_words(self, api):
|
|
644
|
-
|
|
618
|
+
"""It should suggest organizations with words"""
|
|
645
619
|
for i in range(4):
|
|
646
|
-
OrganizationFactory(
|
|
647
|
-
name='mon testé-{0}'.format(i) if i % 2 else faker.word())
|
|
620
|
+
OrganizationFactory(name="mon testé-{0}".format(i) if i % 2 else faker.word())
|
|
648
621
|
|
|
649
|
-
response = api.get(url_for(
|
|
650
|
-
qs={'q': 'mon testé', 'size': '5'})
|
|
622
|
+
response = api.get(url_for("api.suggest_organizations"), qs={"q": "mon testé", "size": "5"})
|
|
651
623
|
assert200(response)
|
|
652
624
|
|
|
653
625
|
assert len(response.json) <= 5
|
|
654
626
|
assert len(response.json) > 1
|
|
655
627
|
|
|
656
628
|
for suggestion in response.json:
|
|
657
|
-
assert
|
|
658
|
-
assert
|
|
659
|
-
assert
|
|
660
|
-
assert
|
|
661
|
-
assert
|
|
629
|
+
assert "id" in suggestion
|
|
630
|
+
assert "slug" in suggestion
|
|
631
|
+
assert "name" in suggestion
|
|
632
|
+
assert "image_url" in suggestion
|
|
633
|
+
assert "mon testé" in suggestion["name"]
|
|
662
634
|
|
|
663
635
|
def test_suggest_organizations_with_apostrophe(self, api):
|
|
664
|
-
|
|
636
|
+
"""It should suggest organizations with words"""
|
|
665
637
|
for i in range(4):
|
|
666
638
|
OrganizationFactory(
|
|
667
|
-
name=
|
|
668
|
-
|
|
639
|
+
name="Ministère de l'intérieur {0}".format(i) if i % 2 else faker.word()
|
|
640
|
+
)
|
|
669
641
|
|
|
670
|
-
response = api.get(url_for(
|
|
671
|
-
qs={'q': 'Ministère', 'size': '5'})
|
|
642
|
+
response = api.get(url_for("api.suggest_organizations"), qs={"q": "Ministère", "size": "5"})
|
|
672
643
|
assert200(response)
|
|
673
644
|
|
|
674
645
|
assert len(response.json) <= 5
|
|
675
646
|
assert len(response.json) > 1
|
|
676
647
|
|
|
677
648
|
for suggestion in response.json:
|
|
678
|
-
assert
|
|
679
|
-
assert
|
|
680
|
-
assert
|
|
681
|
-
assert
|
|
682
|
-
assert
|
|
649
|
+
assert "id" in suggestion
|
|
650
|
+
assert "slug" in suggestion
|
|
651
|
+
assert "name" in suggestion
|
|
652
|
+
assert "image_url" in suggestion
|
|
653
|
+
assert "Ministère" in suggestion["name"]
|
|
683
654
|
|
|
684
655
|
def test_suggest_organizations_api_no_match(self, api):
|
|
685
|
-
|
|
656
|
+
"""It should not provide organization suggestion if no match"""
|
|
686
657
|
OrganizationFactory.create_batch(3)
|
|
687
658
|
|
|
688
|
-
response = api.get(url_for(
|
|
689
|
-
qs={'q': 'xxxxxx', 'size': '5'})
|
|
659
|
+
response = api.get(url_for("api.suggest_organizations"), qs={"q": "xxxxxx", "size": "5"})
|
|
690
660
|
assert200(response)
|
|
691
661
|
assert len(response.json) is 0
|
|
692
662
|
|
|
693
663
|
def test_suggest_organizations_api_empty(self, api):
|
|
694
|
-
|
|
695
|
-
response = api.get(url_for(
|
|
696
|
-
qs={'q': 'xxxxxx', 'size': '5'})
|
|
664
|
+
"""It should not provide organization suggestion if no data"""
|
|
665
|
+
response = api.get(url_for("api.suggest_organizations"), qs={"q": "xxxxxx", "size": "5"})
|
|
697
666
|
assert200(response)
|
|
698
667
|
assert len(response.json) is 0
|
|
699
668
|
|
|
700
669
|
def test_suggest_organizations_homonyms(self, api):
|
|
701
|
-
|
|
702
|
-
OrganizationFactory.create_batch(2, name=
|
|
670
|
+
"""It should suggest organizations and not deduplicate homonyms"""
|
|
671
|
+
OrganizationFactory.create_batch(2, name="homonym")
|
|
703
672
|
|
|
704
|
-
response = api.get(url_for(
|
|
705
|
-
qs={'q': 'homonym', 'size': '5'})
|
|
673
|
+
response = api.get(url_for("api.suggest_organizations"), qs={"q": "homonym", "size": "5"})
|
|
706
674
|
assert200(response)
|
|
707
675
|
|
|
708
676
|
assert len(response.json) is 2
|
|
709
677
|
|
|
710
678
|
for suggestion in response.json:
|
|
711
|
-
assert suggestion[
|
|
679
|
+
assert suggestion["name"] == "homonym"
|
|
712
680
|
|
|
713
681
|
def test_suggest_organizations_acronym(self, api):
|
|
714
|
-
|
|
682
|
+
"""Should suggest organizations based on acronym"""
|
|
715
683
|
|
|
716
684
|
for i in range(3):
|
|
717
685
|
OrganizationFactory(
|
|
718
686
|
name=faker.word(),
|
|
719
|
-
acronym=f
|
|
720
|
-
metrics={"followers": i}
|
|
687
|
+
acronym=f"UDATA{i}" if i % 2 else faker.word(),
|
|
688
|
+
metrics={"followers": i},
|
|
689
|
+
)
|
|
721
690
|
max_follower_organization = OrganizationFactory(
|
|
722
|
-
name=faker.word(),
|
|
723
|
-
acronym='UDATA4',
|
|
724
|
-
metrics={"followers": 10}
|
|
691
|
+
name=faker.word(), acronym="UDATA4", metrics={"followers": 10}
|
|
725
692
|
)
|
|
726
|
-
response = api.get(url_for(
|
|
727
|
-
qs={'q': 'uDaTa', 'size': '5'})
|
|
693
|
+
response = api.get(url_for("api.suggest_organizations"), qs={"q": "uDaTa", "size": "5"})
|
|
728
694
|
assert200(response)
|
|
729
695
|
|
|
730
696
|
assert len(response.json) == 2
|
|
731
697
|
|
|
732
698
|
for suggestion in response.json:
|
|
733
|
-
assert
|
|
734
|
-
assert
|
|
735
|
-
assert
|
|
736
|
-
assert
|
|
737
|
-
assert
|
|
738
|
-
assert
|
|
739
|
-
assert response.json[0][
|
|
699
|
+
assert "id" in suggestion
|
|
700
|
+
assert "slug" in suggestion
|
|
701
|
+
assert "name" in suggestion
|
|
702
|
+
assert "image_url" in suggestion
|
|
703
|
+
assert "acronym" in suggestion
|
|
704
|
+
assert "UDATA" in suggestion["acronym"]
|
|
705
|
+
assert response.json[0]["id"] == str(max_follower_organization.id)
|
|
740
706
|
|
|
741
707
|
|
|
742
708
|
class OrganizationDatasetsAPITest:
|
|
743
709
|
modules = []
|
|
744
710
|
|
|
745
711
|
def test_list_org_datasets(self, api):
|
|
746
|
-
|
|
712
|
+
"""Should list organization datasets"""
|
|
747
713
|
org = OrganizationFactory()
|
|
748
714
|
datasets = DatasetFactory.create_batch(3, organization=org)
|
|
749
715
|
|
|
750
|
-
response = api.get(url_for(
|
|
716
|
+
response = api.get(url_for("api.org_datasets", org=org))
|
|
751
717
|
|
|
752
718
|
assert200(response)
|
|
753
|
-
assert len(response.json[
|
|
719
|
+
assert len(response.json["data"]) == len(datasets)
|
|
754
720
|
|
|
755
721
|
def test_list_org_datasets_private(self, api):
|
|
756
|
-
|
|
722
|
+
"""Should include private datasets when member"""
|
|
757
723
|
user = api.login()
|
|
758
|
-
member = Member(user=user, role=
|
|
724
|
+
member = Member(user=user, role="admin")
|
|
759
725
|
org = OrganizationFactory(members=[member])
|
|
760
|
-
datasets = DatasetFactory.create_batch(3, organization=org,
|
|
761
|
-
private=True)
|
|
726
|
+
datasets = DatasetFactory.create_batch(3, organization=org, private=True)
|
|
762
727
|
|
|
763
|
-
response = api.get(url_for(
|
|
728
|
+
response = api.get(url_for("api.org_datasets", org=org))
|
|
764
729
|
|
|
765
730
|
assert200(response)
|
|
766
|
-
assert len(response.json[
|
|
731
|
+
assert len(response.json["data"]) == len(datasets)
|
|
767
732
|
|
|
768
733
|
def test_list_org_datasets_hide_private(self, api):
|
|
769
|
-
|
|
734
|
+
"""Should not include private datasets when not member"""
|
|
770
735
|
org = OrganizationFactory()
|
|
771
736
|
datasets = DatasetFactory.create_batch(3, organization=org)
|
|
772
737
|
DatasetFactory.create_batch(2, organization=org, private=True)
|
|
773
738
|
|
|
774
|
-
response = api.get(url_for(
|
|
739
|
+
response = api.get(url_for("api.org_datasets", org=org))
|
|
775
740
|
|
|
776
741
|
assert200(response)
|
|
777
|
-
assert len(response.json[
|
|
742
|
+
assert len(response.json["data"]) == len(datasets)
|
|
778
743
|
|
|
779
744
|
def test_list_org_datasets_with_size(self, api):
|
|
780
|
-
|
|
745
|
+
"""Should list organization datasets"""
|
|
781
746
|
org = OrganizationFactory()
|
|
782
747
|
DatasetFactory.create_batch(3, organization=org)
|
|
783
748
|
|
|
784
|
-
response = api.get(
|
|
785
|
-
url_for('api.org_datasets', org=org), qs={'page_size': 2})
|
|
749
|
+
response = api.get(url_for("api.org_datasets", org=org), qs={"page_size": 2})
|
|
786
750
|
|
|
787
751
|
assert200(response)
|
|
788
|
-
assert len(response.json[
|
|
752
|
+
assert len(response.json["data"]) is 2
|
|
789
753
|
|
|
790
754
|
|
|
791
755
|
class OrganizationReusesAPITest:
|
|
792
756
|
modules = []
|
|
793
757
|
|
|
794
758
|
def test_list_org_reuses(self, api):
|
|
795
|
-
|
|
759
|
+
"""Should list organization reuses"""
|
|
796
760
|
org = OrganizationFactory()
|
|
797
761
|
reuses = ReuseFactory.create_batch(3, organization=org)
|
|
798
762
|
|
|
799
|
-
response = api.get(url_for(
|
|
763
|
+
response = api.get(url_for("api.org_reuses", org=org))
|
|
800
764
|
|
|
801
765
|
assert200(response)
|
|
802
766
|
assert len(response.json) == len(reuses)
|
|
803
767
|
|
|
804
768
|
def test_list_org_reuses_private(self, api):
|
|
805
|
-
|
|
769
|
+
"""Should include private reuses when member"""
|
|
806
770
|
user = api.login()
|
|
807
|
-
member = Member(user=user, role=
|
|
771
|
+
member = Member(user=user, role="admin")
|
|
808
772
|
org = OrganizationFactory(members=[member])
|
|
809
773
|
reuses = ReuseFactory.create_batch(3, organization=org, private=True)
|
|
810
774
|
|
|
811
|
-
response = api.get(url_for(
|
|
775
|
+
response = api.get(url_for("api.org_reuses", org=org))
|
|
812
776
|
|
|
813
777
|
assert200(response)
|
|
814
778
|
assert len(response.json) == len(reuses)
|
|
815
779
|
|
|
816
780
|
def test_list_org_reuses_hide_private(self, api):
|
|
817
|
-
|
|
781
|
+
"""Should not include private reuses when not member"""
|
|
818
782
|
org = OrganizationFactory()
|
|
819
783
|
reuses = ReuseFactory.create_batch(3, organization=org)
|
|
820
784
|
ReuseFactory.create_batch(2, organization=org, private=True)
|
|
821
785
|
|
|
822
|
-
response = api.get(url_for(
|
|
786
|
+
response = api.get(url_for("api.org_reuses", org=org))
|
|
823
787
|
|
|
824
788
|
assert200(response)
|
|
825
789
|
assert len(response.json) == len(reuses)
|
|
@@ -829,24 +793,24 @@ class OrganizationDiscussionsAPITest:
|
|
|
829
793
|
modules = []
|
|
830
794
|
|
|
831
795
|
def test_list_org_discussions(self, api):
|
|
832
|
-
|
|
796
|
+
"""Should list organization discussions"""
|
|
833
797
|
user = UserFactory()
|
|
834
798
|
org = OrganizationFactory()
|
|
835
799
|
reuse = ReuseFactory(organization=org)
|
|
836
800
|
dataset = DatasetFactory(organization=org)
|
|
837
801
|
discussions = [
|
|
838
|
-
Discussion.objects.create(subject=dataset, title=
|
|
839
|
-
Discussion.objects.create(subject=reuse, title=
|
|
802
|
+
Discussion.objects.create(subject=dataset, title="", user=user),
|
|
803
|
+
Discussion.objects.create(subject=reuse, title="", user=user),
|
|
840
804
|
]
|
|
841
805
|
|
|
842
|
-
response = api.get(url_for(
|
|
806
|
+
response = api.get(url_for("api.org_discussions", org=org))
|
|
843
807
|
|
|
844
808
|
assert200(response)
|
|
845
809
|
assert len(response.json) == len(discussions)
|
|
846
810
|
|
|
847
811
|
discussions_ids = [str(d.id) for d in discussions]
|
|
848
812
|
for discussion in response.json:
|
|
849
|
-
assert discussion[
|
|
813
|
+
assert discussion["id"] in discussions_ids
|
|
850
814
|
|
|
851
815
|
|
|
852
816
|
class OrganizationBadgeAPITest:
|
|
@@ -855,15 +819,15 @@ class OrganizationBadgeAPITest:
|
|
|
855
819
|
@pytest.fixture(autouse=True)
|
|
856
820
|
def setUp(self, api, clean_db):
|
|
857
821
|
# Register at least two badges
|
|
858
|
-
Organization.__badges__[
|
|
859
|
-
Organization.__badges__[
|
|
822
|
+
Organization.__badges__["test-1"] = "Test 1"
|
|
823
|
+
Organization.__badges__["test-2"] = "Test 2"
|
|
860
824
|
|
|
861
825
|
self.factory = badge_factory(Organization)
|
|
862
826
|
self.user = api.login(AdminFactory())
|
|
863
827
|
self.organization = OrganizationFactory()
|
|
864
828
|
|
|
865
829
|
def test_list(self, api):
|
|
866
|
-
response = api.get(url_for(
|
|
830
|
+
response = api.get(url_for("api.available_organization_badges"))
|
|
867
831
|
assert200(response)
|
|
868
832
|
assert len(response.json) == len(Organization.__badges__)
|
|
869
833
|
for kind, label in Organization.__badges__.items():
|
|
@@ -872,7 +836,7 @@ class OrganizationBadgeAPITest:
|
|
|
872
836
|
|
|
873
837
|
def test_create(self, api):
|
|
874
838
|
data = self.factory.as_dict()
|
|
875
|
-
url = url_for(
|
|
839
|
+
url = url_for("api.organization_badges", org=self.organization)
|
|
876
840
|
with assert_emit(on_badge_added):
|
|
877
841
|
response = api.post(url, data)
|
|
878
842
|
assert201(response)
|
|
@@ -881,7 +845,7 @@ class OrganizationBadgeAPITest:
|
|
|
881
845
|
|
|
882
846
|
def test_create_same(self, api):
|
|
883
847
|
data = self.factory.as_dict()
|
|
884
|
-
url = url_for(
|
|
848
|
+
url = url_for("api.organization_badges", org=self.organization)
|
|
885
849
|
with assert_emit(on_badge_added):
|
|
886
850
|
api.post(url, data)
|
|
887
851
|
with assert_not_emit(on_badge_added):
|
|
@@ -896,8 +860,8 @@ class OrganizationBadgeAPITest:
|
|
|
896
860
|
kinds_keys = list(Organization.__badges__)
|
|
897
861
|
self.organization.add_badge(kinds_keys[0])
|
|
898
862
|
data = self.factory.as_dict()
|
|
899
|
-
data[
|
|
900
|
-
url = url_for(
|
|
863
|
+
data["kind"] = kinds_keys[1]
|
|
864
|
+
url = url_for("api.organization_badges", org=self.organization)
|
|
901
865
|
response = api.post(url, data)
|
|
902
866
|
assert201(response)
|
|
903
867
|
self.organization.reload()
|
|
@@ -907,9 +871,7 @@ class OrganizationBadgeAPITest:
|
|
|
907
871
|
badge = self.factory()
|
|
908
872
|
self.organization.add_badge(badge.kind)
|
|
909
873
|
self.organization.save()
|
|
910
|
-
url = url_for(
|
|
911
|
-
org=self.organization,
|
|
912
|
-
badge_kind=str(badge.kind))
|
|
874
|
+
url = url_for("api.organization_badge", org=self.organization, badge_kind=str(badge.kind))
|
|
913
875
|
with assert_emit(on_badge_removed):
|
|
914
876
|
response = api.delete(url)
|
|
915
877
|
assert204(response)
|
|
@@ -918,7 +880,7 @@ class OrganizationBadgeAPITest:
|
|
|
918
880
|
|
|
919
881
|
def test_delete_404(self, api):
|
|
920
882
|
kind = str(self.factory().kind)
|
|
921
|
-
url = url_for(
|
|
883
|
+
url = url_for("api.organization_badge", org=self.organization, badge_kind=kind)
|
|
922
884
|
response = api.delete(url)
|
|
923
885
|
assert404(response)
|
|
924
886
|
|
|
@@ -928,18 +890,18 @@ class OrganizationContactPointsAPITest:
|
|
|
928
890
|
|
|
929
891
|
def test_org_contact_points(self, api):
|
|
930
892
|
user = api.login()
|
|
931
|
-
member = Member(user=user, role=
|
|
893
|
+
member = Member(user=user, role="admin")
|
|
932
894
|
org = OrganizationFactory(members=[member])
|
|
933
895
|
data = {
|
|
934
|
-
|
|
935
|
-
|
|
936
|
-
|
|
896
|
+
"email": "mooneywayne@cobb-cochran.com",
|
|
897
|
+
"name": "Martin Schultz",
|
|
898
|
+
"organization": str(org.id),
|
|
937
899
|
}
|
|
938
|
-
response = api.post(url_for(
|
|
900
|
+
response = api.post(url_for("api.contact_points"), data)
|
|
939
901
|
assert201(response)
|
|
940
902
|
|
|
941
|
-
response = api.get(url_for(
|
|
903
|
+
response = api.get(url_for("api.org_contact_points", org=org))
|
|
942
904
|
assert200(response)
|
|
943
905
|
|
|
944
|
-
assert response.json[
|
|
945
|
-
assert response.json[
|
|
906
|
+
assert response.json["data"][0]["name"] == data["name"]
|
|
907
|
+
assert response.json["data"][0]["email"] == data["email"]
|