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_storages.py
CHANGED
|
@@ -1,230 +1,241 @@
|
|
|
1
|
-
import pytest
|
|
2
|
-
|
|
3
1
|
from datetime import datetime, timedelta
|
|
4
2
|
from io import BytesIO
|
|
3
|
+
from os.path import basename
|
|
5
4
|
from uuid import uuid4
|
|
6
5
|
|
|
7
|
-
|
|
6
|
+
import pytest
|
|
7
|
+
from flask import json, url_for
|
|
8
|
+
from werkzeug.test import EnvironBuilder
|
|
9
|
+
from werkzeug.wrappers import Request
|
|
8
10
|
|
|
9
11
|
from udata.core import storages
|
|
10
12
|
from udata.core.storages import utils
|
|
11
|
-
from udata.core.storages.api import
|
|
13
|
+
from udata.core.storages.api import META, chunk_filename
|
|
12
14
|
from udata.core.storages.tasks import purge_chunks
|
|
13
15
|
from udata.utils import faker
|
|
14
16
|
|
|
15
17
|
from .helpers import assert200, assert400
|
|
16
18
|
|
|
17
|
-
from os.path import basename
|
|
18
|
-
|
|
19
|
-
from werkzeug.test import EnvironBuilder
|
|
20
|
-
from werkzeug.wrappers import Request
|
|
21
|
-
|
|
22
19
|
|
|
23
20
|
class StorageUtilsTest:
|
|
24
|
-
|
|
21
|
+
"""
|
|
25
22
|
Perform all tests on a file of size 2 * CHUNCK_SIZE = 2 * (2 ** 16).
|
|
26
23
|
Expected values are precomputed with shell `md5sum`, `sha1sum`...
|
|
27
|
-
|
|
24
|
+
"""
|
|
25
|
+
|
|
28
26
|
@pytest.fixture(autouse=True)
|
|
29
27
|
def write_file(self, tmpdir):
|
|
30
|
-
tmpfile = tmpdir.join(
|
|
31
|
-
tmpfile.write_binary(b
|
|
28
|
+
tmpfile = tmpdir.join("test.txt")
|
|
29
|
+
tmpfile.write_binary(b"a" * 2 * (2**16))
|
|
32
30
|
self.file = self.filestorage(str(tmpfile))
|
|
33
31
|
|
|
34
32
|
def filestorage(self, filename):
|
|
35
|
-
data = open(filename,
|
|
36
|
-
builder = EnvironBuilder(method=
|
|
37
|
-
'file': (data, basename(filename))
|
|
38
|
-
})
|
|
33
|
+
data = open(filename, "rb")
|
|
34
|
+
builder = EnvironBuilder(method="POST", data={"file": (data, basename(filename))})
|
|
39
35
|
env = builder.get_environ()
|
|
40
36
|
req = Request(env)
|
|
41
|
-
return req.files[
|
|
37
|
+
return req.files["file"]
|
|
42
38
|
|
|
43
39
|
def test_sha1(self):
|
|
44
40
|
# Output of sha1sum
|
|
45
|
-
expected =
|
|
41
|
+
expected = "ce5653590804baa9369f72d483ed9eba72f04d29"
|
|
46
42
|
assert utils.sha1(self.file) == expected
|
|
47
43
|
|
|
48
44
|
def test_md5(self):
|
|
49
|
-
expected =
|
|
45
|
+
expected = "81615449a98aaaad8dc179b3bec87f38" # Output of md5sum
|
|
50
46
|
assert utils.md5(self.file) == expected
|
|
51
47
|
|
|
52
48
|
def test_crc32(self):
|
|
53
|
-
expected =
|
|
49
|
+
expected = "CA975130" # Output of cksfv
|
|
54
50
|
assert utils.crc32(self.file) == expected
|
|
55
51
|
|
|
56
52
|
def test_mime(self):
|
|
57
|
-
assert utils.mime(
|
|
58
|
-
assert utils.mime(
|
|
53
|
+
assert utils.mime("test.txt") == "text/plain"
|
|
54
|
+
assert utils.mime("test") is None
|
|
59
55
|
|
|
60
56
|
def test_extension_default(self, app):
|
|
61
|
-
assert utils.extension(
|
|
62
|
-
assert utils.extension(
|
|
63
|
-
assert utils.extension(
|
|
57
|
+
assert utils.extension("test.txt") == "txt"
|
|
58
|
+
assert utils.extension("prefix/test.txt") == "txt"
|
|
59
|
+
assert utils.extension("prefix.with.dot/test.txt") == "txt"
|
|
64
60
|
|
|
65
61
|
def test_extension_compound(self, app):
|
|
66
|
-
assert utils.extension(
|
|
67
|
-
assert utils.extension(
|
|
62
|
+
assert utils.extension("test.tar.gz") == "tar.gz"
|
|
63
|
+
assert utils.extension("prefix.with.dot/test.tar.gz") == "tar.gz"
|
|
68
64
|
|
|
69
65
|
def test_extension_compound_with_allowed_extension(self, app):
|
|
70
|
-
assert utils.extension(
|
|
71
|
-
assert utils.extension(
|
|
66
|
+
assert utils.extension("test.2022.csv.tar.gz") == "csv.tar.gz"
|
|
67
|
+
assert utils.extension("prefix.with.dot/test.2022.csv.tar.gz") == "csv.tar.gz"
|
|
72
68
|
|
|
73
69
|
def test_extension_compound_without_allowed_extension(self, app):
|
|
74
|
-
assert utils.extension(
|
|
75
|
-
assert utils.extension(
|
|
70
|
+
assert utils.extension("test.2022.tar.gz") == "tar.gz"
|
|
71
|
+
assert utils.extension("prefix.with.dot/test.2022.tar.gz") == "tar.gz"
|
|
76
72
|
|
|
77
73
|
def test_no_extension(self, app):
|
|
78
|
-
assert utils.extension(
|
|
79
|
-
assert utils.extension(
|
|
74
|
+
assert utils.extension("test") is None
|
|
75
|
+
assert utils.extension("prefix/test") is None
|
|
80
76
|
|
|
81
77
|
def test_normalize_no_changes(self):
|
|
82
|
-
assert utils.normalize(
|
|
78
|
+
assert utils.normalize("test.txt") == "test.txt"
|
|
83
79
|
|
|
84
80
|
def test_normalize_spaces(self):
|
|
85
|
-
expected =
|
|
86
|
-
assert utils.normalize(
|
|
81
|
+
expected = "test-with-spaces.txt"
|
|
82
|
+
assert utils.normalize("test with spaces.txt") == expected
|
|
87
83
|
|
|
88
84
|
def test_normalize_to_lower(self):
|
|
89
|
-
assert utils.normalize(
|
|
85
|
+
assert utils.normalize("Test.TXT") == "test.txt"
|
|
90
86
|
|
|
91
87
|
def test_normalize_special_chars(self):
|
|
92
|
-
assert utils.normalize(
|
|
88
|
+
assert utils.normalize("éàü@€.txt") == "eau-eur.txt"
|
|
93
89
|
|
|
94
90
|
|
|
95
|
-
@pytest.mark.usefixtures(
|
|
91
|
+
@pytest.mark.usefixtures("app")
|
|
96
92
|
class ConfigurableAllowedExtensionsTest:
|
|
97
93
|
def test_has_default(self):
|
|
98
|
-
assert
|
|
99
|
-
assert
|
|
100
|
-
assert
|
|
101
|
-
assert
|
|
102
|
-
assert
|
|
94
|
+
assert "csv" in storages.CONFIGURABLE_AUTHORIZED_TYPES
|
|
95
|
+
assert "xml" in storages.CONFIGURABLE_AUTHORIZED_TYPES
|
|
96
|
+
assert "json" in storages.CONFIGURABLE_AUTHORIZED_TYPES
|
|
97
|
+
assert "exe" not in storages.CONFIGURABLE_AUTHORIZED_TYPES
|
|
98
|
+
assert "bat" not in storages.CONFIGURABLE_AUTHORIZED_TYPES
|
|
103
99
|
|
|
104
|
-
@pytest.mark.options(ALLOWED_RESOURCES_EXTENSIONS=[
|
|
100
|
+
@pytest.mark.options(ALLOWED_RESOURCES_EXTENSIONS=["csv", "json"])
|
|
105
101
|
def test_with_config(self):
|
|
106
|
-
assert
|
|
107
|
-
assert
|
|
108
|
-
assert
|
|
109
|
-
assert
|
|
110
|
-
assert
|
|
102
|
+
assert "csv" in storages.CONFIGURABLE_AUTHORIZED_TYPES
|
|
103
|
+
assert "json" in storages.CONFIGURABLE_AUTHORIZED_TYPES
|
|
104
|
+
assert "xml" not in storages.CONFIGURABLE_AUTHORIZED_TYPES
|
|
105
|
+
assert "exe" not in storages.CONFIGURABLE_AUTHORIZED_TYPES
|
|
106
|
+
assert "bat" not in storages.CONFIGURABLE_AUTHORIZED_TYPES
|
|
111
107
|
|
|
112
108
|
|
|
113
|
-
@pytest.mark.usefixtures(
|
|
109
|
+
@pytest.mark.usefixtures("instance_path")
|
|
114
110
|
class StorageUploadViewTest:
|
|
115
111
|
def test_standard_upload(self, client):
|
|
116
112
|
client.login()
|
|
117
113
|
response = client.post(
|
|
118
|
-
url_for(
|
|
119
|
-
{
|
|
114
|
+
url_for("test-storage.upload", name="resources"),
|
|
115
|
+
{"file": (BytesIO(b"aaa"), "Test with spaces.TXT")},
|
|
116
|
+
)
|
|
120
117
|
|
|
121
118
|
assert200(response)
|
|
122
|
-
assert response.json[
|
|
123
|
-
assert
|
|
124
|
-
assert
|
|
125
|
-
assert
|
|
126
|
-
assert
|
|
127
|
-
filename = response.json[
|
|
128
|
-
assert filename.endswith(
|
|
119
|
+
assert response.json["success"]
|
|
120
|
+
assert "url" in response.json
|
|
121
|
+
assert "size" in response.json
|
|
122
|
+
assert "sha1" in response.json
|
|
123
|
+
assert "filename" in response.json
|
|
124
|
+
filename = response.json["filename"]
|
|
125
|
+
assert filename.endswith("test-with-spaces.txt")
|
|
129
126
|
expected = storages.resources.url(filename, external=True)
|
|
130
|
-
assert response.json[
|
|
131
|
-
assert response.json[
|
|
127
|
+
assert response.json["url"] == expected
|
|
128
|
+
assert response.json["mime"] == "text/plain"
|
|
132
129
|
|
|
133
130
|
def test_chunked_upload(self, client):
|
|
134
131
|
client.login()
|
|
135
|
-
url = url_for(
|
|
132
|
+
url = url_for("test-storage.upload", name="tmp")
|
|
136
133
|
uuid = str(uuid4())
|
|
137
134
|
parts = 4
|
|
138
135
|
|
|
139
136
|
for i in range(parts):
|
|
140
|
-
response = client.post(
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
137
|
+
response = client.post(
|
|
138
|
+
url,
|
|
139
|
+
{
|
|
140
|
+
"file": (BytesIO(b"a"), "blob"),
|
|
141
|
+
"uuid": uuid,
|
|
142
|
+
"filename": "Test with spaces.TXT",
|
|
143
|
+
"partindex": i,
|
|
144
|
+
"partbyteoffset": 0,
|
|
145
|
+
"totalfilesize": parts,
|
|
146
|
+
"totalparts": parts,
|
|
147
|
+
"chunksize": 1,
|
|
148
|
+
},
|
|
149
|
+
)
|
|
150
150
|
|
|
151
151
|
assert200(response)
|
|
152
|
-
assert response.json[
|
|
153
|
-
assert
|
|
154
|
-
assert
|
|
155
|
-
assert
|
|
156
|
-
assert
|
|
157
|
-
assert
|
|
158
|
-
|
|
159
|
-
response = client.post(
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
assert response.json
|
|
169
|
-
assert
|
|
170
|
-
|
|
171
|
-
|
|
152
|
+
assert response.json["success"]
|
|
153
|
+
assert "filename" not in response.json
|
|
154
|
+
assert "url" not in response.json
|
|
155
|
+
assert "size" not in response.json
|
|
156
|
+
assert "sha1" not in response.json
|
|
157
|
+
assert "url" not in response.json
|
|
158
|
+
|
|
159
|
+
response = client.post(
|
|
160
|
+
url,
|
|
161
|
+
{
|
|
162
|
+
"uuid": uuid,
|
|
163
|
+
"filename": "Test with spaces.TXT",
|
|
164
|
+
"totalfilesize": parts,
|
|
165
|
+
"totalparts": parts,
|
|
166
|
+
},
|
|
167
|
+
)
|
|
168
|
+
assert "filename" in response.json
|
|
169
|
+
assert "url" in response.json
|
|
170
|
+
assert "size" in response.json
|
|
171
|
+
assert response.json["size"] == parts
|
|
172
|
+
assert "sha1" in response.json
|
|
173
|
+
expected_filename = "test-with-spaces.txt"
|
|
174
|
+
filename = response.json["filename"]
|
|
172
175
|
assert filename.endswith(expected_filename)
|
|
173
176
|
expected_url = storages.tmp.url(filename, external=True)
|
|
174
|
-
assert response.json[
|
|
175
|
-
assert response.json[
|
|
176
|
-
assert storages.tmp.read(filename) == b
|
|
177
|
+
assert response.json["url"] == expected_url
|
|
178
|
+
assert response.json["mime"] == "text/plain"
|
|
179
|
+
assert storages.tmp.read(filename) == b"aaaa"
|
|
177
180
|
assert list(storages.chunks.list_files()) == []
|
|
178
181
|
|
|
179
182
|
def test_chunked_upload_bad_chunk(self, client):
|
|
180
183
|
client.login()
|
|
181
|
-
url = url_for(
|
|
184
|
+
url = url_for("test-storage.upload", name="tmp")
|
|
182
185
|
uuid = str(uuid4())
|
|
183
186
|
parts = 4
|
|
184
187
|
|
|
185
|
-
response = client.post(
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
188
|
+
response = client.post(
|
|
189
|
+
url,
|
|
190
|
+
{
|
|
191
|
+
"file": (BytesIO(b"a"), "blob"),
|
|
192
|
+
"uuid": uuid,
|
|
193
|
+
"filename": "test.txt",
|
|
194
|
+
"partindex": 0,
|
|
195
|
+
"partbyteoffset": 0,
|
|
196
|
+
"totalfilesize": parts,
|
|
197
|
+
"totalparts": parts,
|
|
198
|
+
"chunksize": 10, # Does not match
|
|
199
|
+
},
|
|
200
|
+
)
|
|
195
201
|
|
|
196
202
|
assert400(response)
|
|
197
|
-
assert not response.json[
|
|
198
|
-
assert
|
|
199
|
-
assert
|
|
200
|
-
assert
|
|
201
|
-
assert
|
|
202
|
-
assert
|
|
203
|
+
assert not response.json["success"]
|
|
204
|
+
assert "filename" not in response.json
|
|
205
|
+
assert "url" not in response.json
|
|
206
|
+
assert "size" not in response.json
|
|
207
|
+
assert "sha1" not in response.json
|
|
208
|
+
assert "url" not in response.json
|
|
203
209
|
|
|
204
210
|
assert list(storages.chunks.list_files()) == []
|
|
205
211
|
|
|
206
212
|
def test_upload_resource_bad_request(self, client):
|
|
207
213
|
client.login()
|
|
208
214
|
response = client.post(
|
|
209
|
-
url_for(
|
|
210
|
-
|
|
215
|
+
url_for("test-storage.upload", name="tmp"), {"bad": (BytesIO(b"aaa"), "test.txt")}
|
|
216
|
+
)
|
|
211
217
|
|
|
212
218
|
assert400(response)
|
|
213
|
-
assert not response.json[
|
|
214
|
-
assert
|
|
219
|
+
assert not response.json["success"]
|
|
220
|
+
assert "error" in response.json
|
|
215
221
|
|
|
216
222
|
|
|
217
|
-
@pytest.mark.usefixtures(
|
|
223
|
+
@pytest.mark.usefixtures("instance_path")
|
|
218
224
|
class ChunksRetentionTest:
|
|
219
225
|
def create_chunks(self, uuid, nb=3, last=None):
|
|
220
226
|
for i in range(nb):
|
|
221
227
|
storages.chunks.write(chunk_filename(uuid, i), faker.word())
|
|
222
|
-
storages.chunks.write(
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
+
storages.chunks.write(
|
|
229
|
+
chunk_filename(uuid, META),
|
|
230
|
+
json.dumps(
|
|
231
|
+
{
|
|
232
|
+
"uuid": str(uuid),
|
|
233
|
+
"filename": faker.file_name(),
|
|
234
|
+
"totalparts": nb + 1,
|
|
235
|
+
"lastchunk": last or datetime.utcnow(),
|
|
236
|
+
}
|
|
237
|
+
),
|
|
238
|
+
)
|
|
228
239
|
|
|
229
240
|
@pytest.mark.options(UPLOAD_MAX_RETENTION=0)
|
|
230
241
|
def test_chunks_cleanup_after_max_retention(self, client):
|
|
@@ -244,9 +255,7 @@ class ChunksRetentionTest:
|
|
|
244
255
|
self.create_chunks(expired_uuid, nb=parts, last=expired)
|
|
245
256
|
self.create_chunks(active_uuid, nb=parts, last=not_expired)
|
|
246
257
|
purge_chunks.apply()
|
|
247
|
-
expected = set([
|
|
248
|
-
chunk_filename(active_uuid, i) for i in range(parts)
|
|
249
|
-
])
|
|
258
|
+
expected = set([chunk_filename(active_uuid, i) for i in range(parts)])
|
|
250
259
|
expected.add(chunk_filename(active_uuid, META))
|
|
251
260
|
assert set(storages.chunks.list_files()) == expected
|
|
252
261
|
assert not storages.chunks.exists(expired_uuid) # Directory should be removed too
|
udata/tests/test_tags.py
CHANGED
|
@@ -1,17 +1,16 @@
|
|
|
1
1
|
import logging
|
|
2
|
-
import pytest
|
|
3
2
|
from io import StringIO
|
|
4
3
|
|
|
4
|
+
import pytest
|
|
5
5
|
from flask import url_for
|
|
6
6
|
|
|
7
|
-
from udata.frontend import csv
|
|
8
|
-
|
|
9
|
-
from udata.tests.helpers import assert200
|
|
10
7
|
from udata.core.dataset.factories import DatasetFactory
|
|
11
8
|
from udata.core.reuse.factories import ReuseFactory
|
|
12
9
|
from udata.core.tags.models import Tag
|
|
13
10
|
from udata.core.tags.tasks import count_tags
|
|
14
|
-
from udata.
|
|
11
|
+
from udata.frontend import csv
|
|
12
|
+
from udata.tags import normalize, slug, tags_list
|
|
13
|
+
from udata.tests.helpers import assert200
|
|
15
14
|
|
|
16
15
|
log = logging.getLogger(__name__)
|
|
17
16
|
|
|
@@ -21,42 +20,42 @@ MAX_TAG_LENGTH = 32
|
|
|
21
20
|
|
|
22
21
|
@pytest.mark.frontend
|
|
23
22
|
class TagsTests:
|
|
24
|
-
modules = [
|
|
23
|
+
modules = ["core.tags"]
|
|
25
24
|
|
|
26
25
|
def test_csv(self, client):
|
|
27
|
-
Tag.objects.create(name=
|
|
28
|
-
Tag.objects.create(name=
|
|
29
|
-
Tag.objects.create(name=
|
|
26
|
+
Tag.objects.create(name="datasets-only", counts={"datasets": 15})
|
|
27
|
+
Tag.objects.create(name="reuses-only", counts={"reuses": 10})
|
|
28
|
+
Tag.objects.create(name="both", counts={"reuses": 10, "datasets": 15})
|
|
30
29
|
|
|
31
|
-
response = client.get(url_for(
|
|
30
|
+
response = client.get(url_for("tags.csv"))
|
|
32
31
|
assert200(response)
|
|
33
|
-
assert response.mimetype ==
|
|
34
|
-
assert response.charset ==
|
|
32
|
+
assert response.mimetype == "text/csv"
|
|
33
|
+
assert response.charset == "utf-8"
|
|
35
34
|
|
|
36
|
-
csvfile = StringIO(response.data.decode(
|
|
35
|
+
csvfile = StringIO(response.data.decode("utf8"))
|
|
37
36
|
reader = reader = csv.get_reader(csvfile)
|
|
38
37
|
header = next(reader)
|
|
39
38
|
rows = list(reader)
|
|
40
39
|
|
|
41
|
-
assert header == [
|
|
40
|
+
assert header == ["name", "datasets", "reuses", "total"]
|
|
42
41
|
assert len(rows) is 3
|
|
43
|
-
assert rows[0] == [
|
|
44
|
-
assert rows[1] == [
|
|
45
|
-
assert rows[2] == [
|
|
42
|
+
assert rows[0] == ["both", "15", "10", "25"]
|
|
43
|
+
assert rows[1] == ["datasets-only", "15", "0", "15"]
|
|
44
|
+
assert rows[2] == ["reuses-only", "0", "10", "10"]
|
|
46
45
|
|
|
47
46
|
def test_count(self):
|
|
48
47
|
for i in range(1, 4):
|
|
49
48
|
# Tags should be normalized and deduplicated.
|
|
50
|
-
tags = ['Tag "{0}"'.format(j) for j in range(i)] + [
|
|
49
|
+
tags = ['Tag "{0}"'.format(j) for j in range(i)] + ["tag-0"]
|
|
51
50
|
DatasetFactory(tags=tags, visible=True)
|
|
52
51
|
ReuseFactory(tags=tags, visible=True)
|
|
53
52
|
|
|
54
53
|
count_tags.run()
|
|
55
54
|
|
|
56
55
|
expected = {
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
56
|
+
"tag-0": 3,
|
|
57
|
+
"tag-1": 2,
|
|
58
|
+
"tag-2": 1,
|
|
60
59
|
}
|
|
61
60
|
|
|
62
61
|
assert len(Tag.objects) == len(expected)
|
|
@@ -64,51 +63,50 @@ class TagsTests:
|
|
|
64
63
|
for name, count in expected.items():
|
|
65
64
|
tag = Tag.objects.get(name=name)
|
|
66
65
|
assert tag.total == 2 * count
|
|
67
|
-
assert tag.counts[
|
|
68
|
-
assert tag.counts[
|
|
66
|
+
assert tag.counts["datasets"] == count
|
|
67
|
+
assert tag.counts["reuses"] == count
|
|
69
68
|
|
|
70
69
|
|
|
71
70
|
class TagsUtilsTest:
|
|
72
|
-
|
|
73
71
|
def test_tags_list(self):
|
|
74
|
-
assert tags_list(
|
|
75
|
-
assert tags_list(
|
|
76
|
-
assert sorted(tags_list(
|
|
77
|
-
assert sorted(tags_list(
|
|
72
|
+
assert tags_list("") == []
|
|
73
|
+
assert tags_list("a") == ["a"]
|
|
74
|
+
assert sorted(tags_list("a, b, c")) == ["a", "b", "c"]
|
|
75
|
+
assert sorted(tags_list("a b, c d, e")) == ["a-b", "c-d", "e"]
|
|
78
76
|
|
|
79
77
|
def test_tags_list_strip(self):
|
|
80
|
-
assert sorted(tags_list(
|
|
81
|
-
assert sorted(tags_list(
|
|
78
|
+
assert sorted(tags_list("a, b , ,,, c")) == ["a", "b", "c"]
|
|
79
|
+
assert sorted(tags_list(" a b , c d, e ")) == ["a-b", "c-d", "e"]
|
|
82
80
|
|
|
83
81
|
def test_tags_list_deduplication(self):
|
|
84
|
-
assert sorted(tags_list(
|
|
82
|
+
assert sorted(tags_list("a b, c d, a b , e")) == ["a-b", "c-d", "e"]
|
|
85
83
|
|
|
86
84
|
def test_slug_empty(self):
|
|
87
|
-
assert slug(
|
|
85
|
+
assert slug("") == ""
|
|
88
86
|
|
|
89
87
|
def test_slug_several_words(self):
|
|
90
|
-
assert slug(
|
|
88
|
+
assert slug("la claire fontaine") == "la-claire-fontaine"
|
|
91
89
|
|
|
92
90
|
def test_slug_accents(self):
|
|
93
|
-
assert slug(
|
|
91
|
+
assert slug("école publique") == "ecole-publique"
|
|
94
92
|
|
|
95
93
|
def test_slug_case(self):
|
|
96
|
-
assert slug(
|
|
94
|
+
assert slug("EcoLe publiquE") == "ecole-publique"
|
|
97
95
|
|
|
98
96
|
def test_slug_consecutive_spaces(self):
|
|
99
|
-
assert slug(
|
|
97
|
+
assert slug("ecole publique") == "ecole-publique"
|
|
100
98
|
|
|
101
99
|
def test_slug_special_characters(self):
|
|
102
|
-
assert slug(
|
|
103
|
-
assert slug(
|
|
104
|
-
assert slug(
|
|
105
|
-
assert slug(
|
|
100
|
+
assert slug("ecole-publique") == "ecole-publique"
|
|
101
|
+
assert slug("ecole publique.") == "ecole-publique"
|
|
102
|
+
assert slug("ecole publique-") == "ecole-publique"
|
|
103
|
+
assert slug("ecole publique_") == "ecole-publique"
|
|
106
104
|
|
|
107
105
|
@pytest.mark.options(TAG_MAX_LENGTH=MAX_TAG_LENGTH)
|
|
108
106
|
def test_normalize(self, app):
|
|
109
|
-
assert normalize(
|
|
110
|
-
assert normalize(
|
|
111
|
-
assert normalize(
|
|
112
|
-
assert normalize(
|
|
113
|
-
assert normalize(
|
|
114
|
-
assert normalize(
|
|
107
|
+
assert normalize("") == ""
|
|
108
|
+
assert normalize("a") == ""
|
|
109
|
+
assert normalize("aa") == ""
|
|
110
|
+
assert normalize("aaa") == "aaa"
|
|
111
|
+
assert normalize("a" * (MAX_TAG_LENGTH + 1)) == "a" * MAX_TAG_LENGTH
|
|
112
|
+
assert normalize("aAa a") == "aaa-a"
|
udata/tests/test_topics.py
CHANGED
|
@@ -1,22 +1,23 @@
|
|
|
1
1
|
import pytest
|
|
2
2
|
|
|
3
|
-
from udata.search import reindex
|
|
4
|
-
from udata.core.topic.factories import TopicFactory
|
|
5
3
|
from udata.core.dataset.factories import DatasetFactory
|
|
4
|
+
from udata.core.topic.factories import TopicFactory
|
|
5
|
+
from udata.search import reindex
|
|
6
6
|
|
|
7
7
|
|
|
8
8
|
@pytest.fixture
|
|
9
9
|
def job_reindex(mocker):
|
|
10
|
-
return mocker.patch.object(reindex,
|
|
10
|
+
return mocker.patch.object(reindex, "delay")
|
|
11
11
|
|
|
12
12
|
|
|
13
13
|
@pytest.fixture
|
|
14
14
|
def job_reindex_undelayed(mocker):
|
|
15
15
|
"""Mock the reindex.delay fn to access the underlying reindex fn"""
|
|
16
|
-
return mocker.patch.object(reindex,
|
|
16
|
+
return mocker.patch.object(reindex, "delay", side_effect=reindex)
|
|
17
|
+
|
|
17
18
|
|
|
19
|
+
pytestmark = pytest.mark.usefixtures("clean_db")
|
|
18
20
|
|
|
19
|
-
pytestmark = pytest.mark.usefixtures('clean_db')
|
|
20
21
|
|
|
21
22
|
class TopicModelTest:
|
|
22
23
|
# allows url_for with correct context when calling reindex
|
|
@@ -26,7 +27,7 @@ class TopicModelTest:
|
|
|
26
27
|
topic = TopicFactory(datasets=[])
|
|
27
28
|
dataset = DatasetFactory()
|
|
28
29
|
|
|
29
|
-
topic.name =
|
|
30
|
+
topic.name = "new_name"
|
|
30
31
|
topic.save()
|
|
31
32
|
job_reindex.assert_not_called()
|
|
32
33
|
|
|
@@ -44,4 +45,3 @@ class TopicModelTest:
|
|
|
44
45
|
# creates a topic with datasets, thus calls reindex
|
|
45
46
|
TopicFactory()
|
|
46
47
|
job_reindex_undelayed.assert_called()
|
|
47
|
-
|