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/test_transfer.py
CHANGED
|
@@ -1,24 +1,23 @@
|
|
|
1
1
|
import pytest
|
|
2
2
|
|
|
3
|
-
from udata.auth import
|
|
4
|
-
|
|
5
|
-
from udata.features.transfer.factories import TransferFactory
|
|
6
|
-
from udata.features.transfer.actions import request_transfer, accept_transfer
|
|
7
|
-
from udata.features.transfer.notifications import (
|
|
8
|
-
transfer_request_notifications
|
|
9
|
-
)
|
|
10
|
-
from udata.models import Member, Dataset
|
|
11
|
-
|
|
12
|
-
from udata.utils import faker
|
|
3
|
+
from udata.auth import PermissionDenied, login_user
|
|
13
4
|
from udata.core.dataset.factories import DatasetFactory
|
|
14
5
|
from udata.core.organization.factories import OrganizationFactory
|
|
15
|
-
from udata.core.organization.metrics import
|
|
16
|
-
|
|
17
|
-
|
|
6
|
+
from udata.core.organization.metrics import (
|
|
7
|
+
update_org_metrics, # noqa needed to register signals
|
|
8
|
+
)
|
|
9
|
+
from udata.core.user.factories import UserFactory
|
|
10
|
+
from udata.core.user.metrics import (
|
|
11
|
+
update_owner_metrics, # noqa needed to register signals
|
|
12
|
+
)
|
|
13
|
+
from udata.features.transfer.actions import accept_transfer, request_transfer
|
|
14
|
+
from udata.features.transfer.factories import TransferFactory
|
|
15
|
+
from udata.features.transfer.notifications import transfer_request_notifications
|
|
16
|
+
from udata.models import Dataset, Member
|
|
18
17
|
from udata.tests.helpers import assert_emit
|
|
18
|
+
from udata.utils import faker
|
|
19
19
|
|
|
20
|
-
|
|
21
|
-
pytestmark = pytest.mark.usefixtures('clean_db')
|
|
20
|
+
pytestmark = pytest.mark.usefixtures("clean_db")
|
|
22
21
|
|
|
23
22
|
|
|
24
23
|
class TransferStartTest:
|
|
@@ -29,7 +28,7 @@ class TransferStartTest:
|
|
|
29
28
|
assert transfer.recipient == recipient
|
|
30
29
|
assert transfer.subject == subject
|
|
31
30
|
assert transfer.comment == comment
|
|
32
|
-
assert transfer.status ==
|
|
31
|
+
assert transfer.status == "pending"
|
|
33
32
|
|
|
34
33
|
def test_request_transfer_owner_to_user(self):
|
|
35
34
|
user = UserFactory()
|
|
@@ -42,7 +41,7 @@ class TransferStartTest:
|
|
|
42
41
|
|
|
43
42
|
def test_request_transfer_organization_to_user(self):
|
|
44
43
|
user = UserFactory()
|
|
45
|
-
member = Member(user=user, role=
|
|
44
|
+
member = Member(user=user, role="admin")
|
|
46
45
|
org = OrganizationFactory(members=[member])
|
|
47
46
|
dataset = DatasetFactory(owner=user, organization=org)
|
|
48
47
|
recipient = UserFactory()
|
|
@@ -72,7 +71,7 @@ class TransferStartTest:
|
|
|
72
71
|
|
|
73
72
|
def test_request_transfer_not_authorized_not_admin(self):
|
|
74
73
|
user = UserFactory()
|
|
75
|
-
member = Member(user=user, role=
|
|
74
|
+
member = Member(user=user, role="editor")
|
|
76
75
|
org = OrganizationFactory(members=[member])
|
|
77
76
|
dataset = DatasetFactory(organization=org)
|
|
78
77
|
recipient = UserFactory()
|
|
@@ -93,7 +92,7 @@ class TransferStartTest:
|
|
|
93
92
|
|
|
94
93
|
def test_request_transfer_to_same_organization(self):
|
|
95
94
|
user = UserFactory()
|
|
96
|
-
member = Member(user=user, role=
|
|
95
|
+
member = Member(user=user, role="admin")
|
|
97
96
|
org = OrganizationFactory(members=[member])
|
|
98
97
|
dataset = DatasetFactory(owner=user, organization=org)
|
|
99
98
|
comment = faker.sentence()
|
|
@@ -109,74 +108,68 @@ class TransferAcceptTest:
|
|
|
109
108
|
owner = UserFactory()
|
|
110
109
|
recipient = UserFactory()
|
|
111
110
|
subject = DatasetFactory(owner=owner)
|
|
112
|
-
transfer = TransferFactory(owner=owner,
|
|
113
|
-
recipient=recipient,
|
|
114
|
-
subject=subject)
|
|
111
|
+
transfer = TransferFactory(owner=owner, recipient=recipient, subject=subject)
|
|
115
112
|
|
|
116
113
|
owner.reload() # Needs updated metrics
|
|
117
|
-
assert owner.get_metrics()[
|
|
114
|
+
assert owner.get_metrics()["datasets"] == 1
|
|
118
115
|
|
|
119
116
|
recipient.reload() # Needs updated metrics
|
|
120
|
-
assert recipient.get_metrics()[
|
|
117
|
+
assert recipient.get_metrics()["datasets"] == 0
|
|
121
118
|
|
|
122
119
|
login_user(recipient)
|
|
123
120
|
transfer = accept_transfer(transfer)
|
|
124
121
|
|
|
125
|
-
assert transfer.status ==
|
|
122
|
+
assert transfer.status == "accepted"
|
|
126
123
|
|
|
127
124
|
subject.reload()
|
|
128
125
|
assert subject.owner == recipient
|
|
129
126
|
|
|
130
127
|
recipient.reload()
|
|
131
|
-
assert recipient.get_metrics()[
|
|
128
|
+
assert recipient.get_metrics()["datasets"] == 1
|
|
132
129
|
|
|
133
130
|
owner.reload()
|
|
134
|
-
assert owner.get_metrics()[
|
|
131
|
+
assert owner.get_metrics()["datasets"] == 0
|
|
135
132
|
|
|
136
133
|
def test_org_admin_can_accept_transfer(self):
|
|
137
134
|
owner = UserFactory()
|
|
138
135
|
admin = UserFactory()
|
|
139
|
-
org = OrganizationFactory(members=[Member(user=admin, role=
|
|
136
|
+
org = OrganizationFactory(members=[Member(user=admin, role="admin")])
|
|
140
137
|
subject = DatasetFactory(owner=owner)
|
|
141
|
-
transfer = TransferFactory(owner=owner,
|
|
142
|
-
recipient=org,
|
|
143
|
-
subject=subject)
|
|
138
|
+
transfer = TransferFactory(owner=owner, recipient=org, subject=subject)
|
|
144
139
|
|
|
145
140
|
owner.reload() # Needs updated metrics
|
|
146
|
-
assert owner.get_metrics()[
|
|
141
|
+
assert owner.get_metrics()["datasets"] == 1
|
|
147
142
|
|
|
148
143
|
org.reload() # Needs updated metrics
|
|
149
|
-
assert org.get_metrics()[
|
|
144
|
+
assert org.get_metrics()["datasets"] == 0
|
|
150
145
|
|
|
151
146
|
admin.reload() # Needs updated metrics
|
|
152
|
-
assert admin.get_metrics()[
|
|
147
|
+
assert admin.get_metrics()["datasets"] == 0
|
|
153
148
|
|
|
154
149
|
login_user(admin)
|
|
155
150
|
transfer = accept_transfer(transfer)
|
|
156
151
|
|
|
157
|
-
assert transfer.status ==
|
|
152
|
+
assert transfer.status == "accepted"
|
|
158
153
|
|
|
159
154
|
subject.reload()
|
|
160
155
|
assert subject.organization == org
|
|
161
156
|
assert subject.owner is None
|
|
162
157
|
|
|
163
158
|
org.reload()
|
|
164
|
-
assert org.get_metrics()[
|
|
159
|
+
assert org.get_metrics()["datasets"] == 1
|
|
165
160
|
|
|
166
161
|
admin.reload()
|
|
167
|
-
assert admin.get_metrics()[
|
|
162
|
+
assert admin.get_metrics()["datasets"] == 0
|
|
168
163
|
|
|
169
164
|
owner.reload()
|
|
170
|
-
assert owner.get_metrics()[
|
|
165
|
+
assert owner.get_metrics()["datasets"] == 0
|
|
171
166
|
|
|
172
167
|
def test_org_editor_cant_accept_transfer(self):
|
|
173
168
|
owner = UserFactory()
|
|
174
169
|
editor = UserFactory()
|
|
175
|
-
org = OrganizationFactory(members=[Member(user=editor, role=
|
|
170
|
+
org = OrganizationFactory(members=[Member(user=editor, role="editor")])
|
|
176
171
|
subject = DatasetFactory(organization=org)
|
|
177
|
-
transfer = TransferFactory(owner=owner,
|
|
178
|
-
recipient=org,
|
|
179
|
-
subject=subject)
|
|
172
|
+
transfer = TransferFactory(owner=owner, recipient=org, subject=subject)
|
|
180
173
|
|
|
181
174
|
login_user(editor)
|
|
182
175
|
with pytest.raises(PermissionDenied):
|
|
@@ -201,15 +194,15 @@ class TransferNotificationsTest:
|
|
|
201
194
|
notifications = transfer_request_notifications(recipient)
|
|
202
195
|
assert len(notifications) == len(datasets)
|
|
203
196
|
for dt, details in notifications:
|
|
204
|
-
transfer = transfers[details[
|
|
205
|
-
assert details[
|
|
206
|
-
assert details[
|
|
197
|
+
transfer = transfers[details["id"]]
|
|
198
|
+
assert details["subject"]["class"] == "dataset"
|
|
199
|
+
assert details["subject"]["id"] == transfer.subject.id
|
|
207
200
|
|
|
208
201
|
def test_pending_transfer_request_for_org(self):
|
|
209
202
|
user = UserFactory()
|
|
210
203
|
datasets = DatasetFactory.create_batch(2, owner=user)
|
|
211
204
|
recipient = UserFactory()
|
|
212
|
-
member = Member(user=recipient, role=
|
|
205
|
+
member = Member(user=recipient, role="editor")
|
|
213
206
|
org = OrganizationFactory(members=[member])
|
|
214
207
|
comment = faker.sentence()
|
|
215
208
|
transfers = {}
|
|
@@ -224,6 +217,6 @@ class TransferNotificationsTest:
|
|
|
224
217
|
notifications = transfer_request_notifications(recipient)
|
|
225
218
|
assert len(notifications) == len(datasets)
|
|
226
219
|
for dt, details in notifications:
|
|
227
|
-
transfer = transfers[details[
|
|
228
|
-
assert details[
|
|
229
|
-
assert details[
|
|
220
|
+
transfer = transfers[details["id"]]
|
|
221
|
+
assert details["subject"]["class"] == "dataset"
|
|
222
|
+
assert details["subject"]["id"] == transfer.subject.id
|
udata/tests/test_uris.py
CHANGED
|
@@ -3,290 +3,289 @@ import pytest
|
|
|
3
3
|
from udata import uris
|
|
4
4
|
from udata.settings import Defaults
|
|
5
5
|
|
|
6
|
-
|
|
7
6
|
PUBLIC_HOSTS = [
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
7
|
+
"http://foo.com/blah_blah",
|
|
8
|
+
"http://foo.com/blah_blah/",
|
|
9
|
+
"http://foo.com/blah_blah_(wikipedia)",
|
|
10
|
+
"http://foo.com/blah_blah_(wikipedia)_(again)",
|
|
11
|
+
"http://www.example.com/wpstyle/?p=364",
|
|
12
|
+
"https://www.example.com/foo/?bar=baz&inga=42&quux",
|
|
13
|
+
"http://✪df.ws/123",
|
|
14
|
+
"http://➡.ws/䨹",
|
|
15
|
+
"http://⌘.ws",
|
|
16
|
+
"http://⌘.ws/",
|
|
17
|
+
"http://foo.com/blah_(wikipedia)#cite-1",
|
|
18
|
+
"http://foo.com/blah_(wikipedia)_blah#cite-1",
|
|
19
|
+
"http://foo.com/unicode_(✪)_in_parens",
|
|
20
|
+
"http://foo.com/(something)?after=parens",
|
|
21
|
+
"http://☺.damowmow.com/",
|
|
22
|
+
"http://code.google.com/events/#&product=browser",
|
|
23
|
+
"http://j.mp",
|
|
24
|
+
"ftp://foo.bar/baz",
|
|
25
|
+
"http://foo.bar/?q=Test%20URL-encoded%20stuff",
|
|
26
|
+
"http://مثال.إختبار.com",
|
|
27
|
+
"http://例子.测试.com",
|
|
28
|
+
"http://उदाहरण.परीक्षा.com",
|
|
29
|
+
"http://-.~_!$&'()*+,;=:%40:80%2f::::::@example.com",
|
|
30
|
+
"http://1337.net",
|
|
31
|
+
"http://a.b-c.de",
|
|
32
|
+
"https://foo_bar.example.com/",
|
|
33
|
+
"ftps://foo.bar/",
|
|
34
|
+
"//foo.bar/",
|
|
36
35
|
]
|
|
37
36
|
|
|
38
37
|
PUBLIC_HOSTS_IDN = [
|
|
39
|
-
|
|
40
|
-
|
|
38
|
+
"http://例子.中国",
|
|
39
|
+
"http://somewhere.укр",
|
|
41
40
|
]
|
|
42
41
|
|
|
43
42
|
WITH_CREDENTIALS = [
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
43
|
+
"http://userid:password@example.com:8080",
|
|
44
|
+
"http://userid:password@example.com:8080/",
|
|
45
|
+
"http://userid@example.com",
|
|
46
|
+
"http://userid@example.com/",
|
|
47
|
+
"http://userid@example.com:8080",
|
|
48
|
+
"http://userid@example.com:8080/",
|
|
49
|
+
"http://userid:password@example.com",
|
|
50
|
+
"http://userid:password@example.com/",
|
|
52
51
|
]
|
|
53
52
|
|
|
54
53
|
PUBLIC_IPS = [
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
54
|
+
"http://142.42.1.1/",
|
|
55
|
+
"http://142.42.1.1:8080",
|
|
56
|
+
"http://142.42.1.1:8080/",
|
|
57
|
+
"http://223.255.255.254",
|
|
58
|
+
"http://[2a00:1450:4007:80e::2004]",
|
|
59
|
+
"http://[2a00:1450:4007:80e::2004]:8080",
|
|
60
|
+
"http://[2a00:1450:4007:80e::2004]:8080/",
|
|
62
61
|
]
|
|
63
62
|
|
|
64
63
|
PUBLIC = PUBLIC_HOSTS + PUBLIC_HOSTS_IDN + PUBLIC_IPS + WITH_CREDENTIALS
|
|
65
64
|
|
|
66
65
|
PRIVATE_IPS = [
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
66
|
+
"http://10.1.1.1",
|
|
67
|
+
"http://10.1.1.1:8080",
|
|
68
|
+
"http://10.1.1.1:8080/index.html",
|
|
69
|
+
"http://10.1.1.254",
|
|
70
|
+
"http://10.1.1.254:8080",
|
|
71
|
+
"http://10.1.1.254:8080/index.html",
|
|
72
|
+
"http://[fc00::1]",
|
|
73
|
+
"http://[fc00::1]:8080",
|
|
74
|
+
"http://[fc00::1]:8080/index.html",
|
|
76
75
|
]
|
|
77
76
|
|
|
78
77
|
PRIVATE = PRIVATE_IPS
|
|
79
78
|
|
|
80
79
|
LOCAL_HOSTS = [
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
80
|
+
"http://localhost",
|
|
81
|
+
"http://localhost:8080",
|
|
82
|
+
"http://localhost:8080/index.html",
|
|
83
|
+
"http://localhost.localdomain",
|
|
84
|
+
"http://localhost.localdomain:8080",
|
|
85
|
+
"http://localhost.localdomain:8080/index.html",
|
|
87
86
|
]
|
|
88
87
|
|
|
89
88
|
LOCAL_IPS = [
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
89
|
+
"http://127.0.0.1",
|
|
90
|
+
"http://127.0.0.1:8080",
|
|
91
|
+
"http://127.0.0.1:8080/index.html",
|
|
92
|
+
"http://127.0.1.1",
|
|
93
|
+
"http://127.0.1.1:8080",
|
|
94
|
+
"http://127.0.1.1:8080/index.html",
|
|
95
|
+
"http://[::1]",
|
|
96
|
+
"http://[::1]:8080",
|
|
97
|
+
"http://[::1]:8080/index.html",
|
|
99
98
|
]
|
|
100
99
|
|
|
101
100
|
LOCAL = LOCAL_HOSTS + LOCAL_IPS
|
|
102
101
|
|
|
103
102
|
MULTICAST = [
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
103
|
+
"http://224.1.1.1",
|
|
104
|
+
"http://224.1.1.1:8080",
|
|
105
|
+
"http://224.1.1.1:8080/index.html",
|
|
106
|
+
"http://[ff00::1]",
|
|
107
|
+
"http://[ff00::1]:8080",
|
|
108
|
+
"http://[ff00::1]:8080/index.html",
|
|
110
109
|
]
|
|
111
110
|
|
|
112
111
|
INVALID = [
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
112
|
+
"http://",
|
|
113
|
+
"h/://.",
|
|
114
|
+
"http://..",
|
|
115
|
+
"http://../",
|
|
116
|
+
"http://?",
|
|
117
|
+
"http://??",
|
|
118
|
+
"http://??/",
|
|
119
|
+
"http://#",
|
|
120
|
+
"http://##",
|
|
121
|
+
"http://##/",
|
|
122
|
+
"http://foo.bar?q=Spaces should be encoded",
|
|
123
|
+
"http://foo.bar?q=Spaces should be encoded with unicode é",
|
|
124
|
+
"//",
|
|
125
|
+
"//a",
|
|
126
|
+
"///a",
|
|
127
|
+
"///",
|
|
128
|
+
"http:///a",
|
|
129
|
+
"foo.com",
|
|
130
|
+
"rdar://1234",
|
|
131
|
+
"h://test",
|
|
132
|
+
"http:// shouldfail.com",
|
|
133
|
+
":// should fail",
|
|
134
|
+
"http://foo.bar/foo(bar)baz quux",
|
|
135
|
+
"http://-error-.invalid/",
|
|
136
|
+
"http://_error_.invalid/",
|
|
137
|
+
"http://a.b--c.de/",
|
|
138
|
+
"http://-a.b.co",
|
|
139
|
+
"http://a.b-.co",
|
|
140
|
+
"http://0.0.0.0",
|
|
141
|
+
"http://10.1.1.0",
|
|
142
|
+
"http://10.1.1.255",
|
|
143
|
+
"http://1.1.1.1.1",
|
|
144
|
+
"http://123.123.123",
|
|
145
|
+
"http://3628126748",
|
|
146
|
+
"http://.www.foo.bar/",
|
|
147
|
+
"http://www.foo.bar./",
|
|
148
|
+
"http://.www.foo.bar./",
|
|
149
|
+
"http://[fffff:1450:4007:80e::2004]",
|
|
150
|
+
"http://[fffff:1450:4007:80e::2004]:8080",
|
|
151
|
+
"http://[fffff:1450:4007:80e::2004]:8080/index.html",
|
|
152
|
+
"http://[::]",
|
|
153
|
+
"http://[::]:8080",
|
|
154
|
+
"http://[::]:8080/index.html",
|
|
156
155
|
]
|
|
157
156
|
|
|
158
157
|
DEFAULT_SCHEMES = Defaults.URLS_ALLOWED_SCHEMES
|
|
159
158
|
# Custom schemes not in uris.SCHEMES
|
|
160
|
-
CUSTOM_SCHEMES = [
|
|
159
|
+
CUSTOM_SCHEMES = ["irc", "unknown"]
|
|
161
160
|
|
|
162
161
|
# Extract some default TLDs
|
|
163
162
|
DEFAULT_TLDS = list(Defaults.URLS_ALLOWED_TLDS)[:2]
|
|
164
163
|
# Custom TLDs not in IANA official list
|
|
165
|
-
CUSTOM_TLDS = [
|
|
164
|
+
CUSTOM_TLDS = ["i2", "unknown"]
|
|
166
165
|
|
|
167
166
|
|
|
168
167
|
def test_validate_strip_url():
|
|
169
|
-
assert uris.validate(
|
|
168
|
+
assert uris.validate(" http://somewhere.com ") == "http://somewhere.com"
|
|
170
169
|
|
|
171
170
|
|
|
172
|
-
@pytest.mark.parametrize(
|
|
171
|
+
@pytest.mark.parametrize("url", PUBLIC_HOSTS)
|
|
173
172
|
def test_default_should_validate_public_urls(url):
|
|
174
173
|
assert uris.validate(url) == url
|
|
175
174
|
|
|
176
175
|
|
|
177
|
-
@pytest.mark.parametrize(
|
|
176
|
+
@pytest.mark.parametrize("url", PUBLIC_HOSTS_IDN)
|
|
178
177
|
def test_default_should_validate_public_urls_with_utf8_tld(url):
|
|
179
178
|
assert uris.validate(url) == url
|
|
180
179
|
|
|
181
180
|
|
|
182
|
-
@pytest.mark.parametrize(
|
|
181
|
+
@pytest.mark.parametrize("url", PUBLIC_IPS)
|
|
183
182
|
def test_default_should_validate_public_ips(url):
|
|
184
183
|
assert uris.validate(url) == url
|
|
185
184
|
|
|
186
185
|
|
|
187
|
-
@pytest.mark.parametrize(
|
|
186
|
+
@pytest.mark.parametrize("scheme", DEFAULT_SCHEMES)
|
|
188
187
|
def test_default_should_validate_default_schemes(scheme):
|
|
189
|
-
url =
|
|
188
|
+
url = "{0}://somewhere.com".format(scheme)
|
|
190
189
|
assert uris.validate(url) == url
|
|
191
190
|
|
|
192
191
|
|
|
193
|
-
@pytest.mark.parametrize(
|
|
192
|
+
@pytest.mark.parametrize("scheme", CUSTOM_SCHEMES)
|
|
194
193
|
def test_default_should_not_validate_non_default_schemes(scheme):
|
|
195
|
-
url =
|
|
196
|
-
with pytest.raises(uris.ValidationError, match=
|
|
194
|
+
url = "{0}://somewhere.com".format(scheme)
|
|
195
|
+
with pytest.raises(uris.ValidationError, match="Invalid scheme"):
|
|
197
196
|
uris.validate(url)
|
|
198
197
|
|
|
199
198
|
|
|
200
|
-
@pytest.mark.parametrize(
|
|
199
|
+
@pytest.mark.parametrize("tld", CUSTOM_TLDS)
|
|
201
200
|
def test_default_should_not_validate_unknown_tlds(tld):
|
|
202
|
-
url =
|
|
203
|
-
with pytest.raises(uris.ValidationError, match=
|
|
201
|
+
url = "http://somewhere.{0}".format(tld)
|
|
202
|
+
with pytest.raises(uris.ValidationError, match="Invalid TLD"):
|
|
204
203
|
uris.validate(url)
|
|
205
204
|
|
|
206
205
|
|
|
207
|
-
@pytest.mark.parametrize(
|
|
206
|
+
@pytest.mark.parametrize("url", PRIVATE)
|
|
208
207
|
def test_default_should_not_validate_private_urls(url):
|
|
209
|
-
with pytest.raises(uris.ValidationError, match=
|
|
208
|
+
with pytest.raises(uris.ValidationError, match="private URL"):
|
|
210
209
|
uris.validate(url)
|
|
211
210
|
|
|
212
211
|
|
|
213
|
-
@pytest.mark.parametrize(
|
|
212
|
+
@pytest.mark.parametrize("url", LOCAL_HOSTS)
|
|
214
213
|
def test_default_should_not_validate_local_hosts(url):
|
|
215
|
-
with pytest.raises(uris.ValidationError, match=
|
|
214
|
+
with pytest.raises(uris.ValidationError, match="local URL"):
|
|
216
215
|
uris.validate(url)
|
|
217
216
|
|
|
218
217
|
|
|
219
|
-
@pytest.mark.parametrize(
|
|
218
|
+
@pytest.mark.parametrize("url", INVALID)
|
|
220
219
|
def test_should_not_validate_bad_urls(url):
|
|
221
|
-
with pytest.raises(uris.ValidationError, match=
|
|
220
|
+
with pytest.raises(uris.ValidationError, match="Invalid URL"):
|
|
222
221
|
uris.validate(url)
|
|
223
222
|
|
|
224
223
|
|
|
225
|
-
@pytest.mark.parametrize(
|
|
224
|
+
@pytest.mark.parametrize("url", MULTICAST)
|
|
226
225
|
def test_should_not_validate_multicast_urls(url):
|
|
227
|
-
with pytest.raises(uris.ValidationError, match=
|
|
226
|
+
with pytest.raises(uris.ValidationError, match="multicast IP"):
|
|
228
227
|
uris.validate(url)
|
|
229
228
|
|
|
230
229
|
|
|
231
|
-
@pytest.mark.parametrize(
|
|
230
|
+
@pytest.mark.parametrize("url", PUBLIC + PRIVATE)
|
|
232
231
|
def test_private_should_validate_public_and_private_urls(url):
|
|
233
232
|
assert uris.validate(url, private=True) == url
|
|
234
233
|
|
|
235
234
|
|
|
236
|
-
@pytest.mark.parametrize(
|
|
235
|
+
@pytest.mark.parametrize("url", LOCAL)
|
|
237
236
|
def test_private_should_not_validate_local_urls(url):
|
|
238
|
-
with pytest.raises(uris.ValidationError, match=
|
|
237
|
+
with pytest.raises(uris.ValidationError, match="local URL"):
|
|
239
238
|
uris.validate(url, private=True)
|
|
240
239
|
|
|
241
240
|
|
|
242
|
-
@pytest.mark.parametrize(
|
|
241
|
+
@pytest.mark.parametrize("url", PUBLIC + LOCAL)
|
|
243
242
|
def test_local_should_validate_public_and_local_urls(url):
|
|
244
243
|
assert uris.validate(url, local=True) == url
|
|
245
244
|
|
|
246
245
|
|
|
247
|
-
@pytest.mark.parametrize(
|
|
246
|
+
@pytest.mark.parametrize("url", PRIVATE)
|
|
248
247
|
def test_local_should_not_validate_private_urls(url):
|
|
249
|
-
with pytest.raises(uris.ValidationError, match=
|
|
248
|
+
with pytest.raises(uris.ValidationError, match="private URL"):
|
|
250
249
|
uris.validate(url, local=True)
|
|
251
250
|
|
|
252
251
|
|
|
253
|
-
@pytest.mark.parametrize(
|
|
252
|
+
@pytest.mark.parametrize("url", PUBLIC + LOCAL + PRIVATE)
|
|
254
253
|
def test_private_local_should_validate_any_valid_urls(url):
|
|
255
254
|
assert uris.validate(url, local=True, private=True) == url
|
|
256
255
|
|
|
257
256
|
|
|
258
|
-
@pytest.mark.parametrize(
|
|
257
|
+
@pytest.mark.parametrize("scheme", CUSTOM_SCHEMES)
|
|
259
258
|
def test_custom_schemes(scheme):
|
|
260
|
-
url =
|
|
259
|
+
url = "{0}://somewhere.com".format(scheme)
|
|
261
260
|
assert uris.validate(url, schemes=CUSTOM_SCHEMES) == url
|
|
262
261
|
|
|
263
262
|
|
|
264
|
-
@pytest.mark.parametrize(
|
|
263
|
+
@pytest.mark.parametrize("scheme", DEFAULT_SCHEMES)
|
|
265
264
|
def test_custom_schemes_should_not_validate_defaults(scheme):
|
|
266
|
-
url =
|
|
267
|
-
with pytest.raises(uris.ValidationError, match=
|
|
265
|
+
url = "{0}://somewhere.com".format(scheme)
|
|
266
|
+
with pytest.raises(uris.ValidationError, match="Invalid scheme"):
|
|
268
267
|
uris.validate(url, schemes=CUSTOM_SCHEMES)
|
|
269
268
|
|
|
270
269
|
|
|
271
|
-
@pytest.mark.parametrize(
|
|
270
|
+
@pytest.mark.parametrize("tld", CUSTOM_TLDS)
|
|
272
271
|
def test_custom_tlds(tld):
|
|
273
|
-
url =
|
|
272
|
+
url = "http://somewhere.{0}".format(tld)
|
|
274
273
|
assert uris.validate(url, tlds=CUSTOM_TLDS) == url
|
|
275
274
|
|
|
276
275
|
|
|
277
|
-
@pytest.mark.parametrize(
|
|
276
|
+
@pytest.mark.parametrize("tld", DEFAULT_TLDS)
|
|
278
277
|
def test_custom_tlds_should_not_validate_defaults(tld):
|
|
279
|
-
url =
|
|
280
|
-
with pytest.raises(uris.ValidationError, match=
|
|
278
|
+
url = "http://somewhere.{0}".format(tld)
|
|
279
|
+
with pytest.raises(uris.ValidationError, match="Invalid "):
|
|
281
280
|
uris.validate(url, tlds=CUSTOM_TLDS)
|
|
282
281
|
|
|
283
282
|
|
|
284
|
-
@pytest.mark.parametrize(
|
|
283
|
+
@pytest.mark.parametrize("url", WITH_CREDENTIALS)
|
|
285
284
|
def test_with_credentials(url):
|
|
286
285
|
assert uris.validate(url) == url
|
|
287
286
|
|
|
288
287
|
|
|
289
|
-
@pytest.mark.parametrize(
|
|
288
|
+
@pytest.mark.parametrize("url", WITH_CREDENTIALS)
|
|
290
289
|
def test_with_credentials_disabled(url):
|
|
291
|
-
with pytest.raises(uris.ValidationError, match=
|
|
290
|
+
with pytest.raises(uris.ValidationError, match="Credentials in URL are not allowed"):
|
|
292
291
|
uris.validate(url, credentials=False)
|