udata 12.0.2.dev17__py3-none-any.whl → 12.0.2.dev18__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.

Files changed (110) hide show
  1. udata/commands/tests/test_fixtures.py +2 -3
  2. udata/core/badges/tests/test_commands.py +2 -4
  3. udata/core/badges/tests/test_model.py +2 -2
  4. udata/core/pages/tests/test_api.py +0 -2
  5. udata/core/spatial/tests/test_api.py +17 -20
  6. udata/core/spatial/tests/test_models.py +3 -3
  7. udata/core/user/tests/test_user_model.py +2 -6
  8. udata/features/identicon/tests/test_backends.py +3 -13
  9. udata/harvest/tests/ckan/test_ckan_backend.py +300 -337
  10. udata/harvest/tests/ckan/test_ckan_backend_errors.py +94 -99
  11. udata/harvest/tests/ckan/test_ckan_backend_filters.py +128 -122
  12. udata/harvest/tests/ckan/test_dkan_backend.py +39 -51
  13. udata/harvest/tests/test_actions.py +7 -7
  14. udata/harvest/tests/test_api.py +2 -4
  15. udata/harvest/tests/test_base_backend.py +3 -4
  16. udata/harvest/tests/test_dcat_backend.py +4 -6
  17. udata/harvest/tests/test_models.py +2 -4
  18. udata/harvest/tests/test_notifications.py +2 -4
  19. udata/harvest/tests/test_tasks.py +2 -3
  20. udata/tests/__init__.py +40 -58
  21. udata/tests/api/__init__.py +87 -2
  22. udata/tests/api/test_activities_api.py +17 -23
  23. udata/tests/api/test_auth_api.py +2 -4
  24. udata/tests/api/test_contact_points.py +48 -54
  25. udata/tests/api/test_dataservices_api.py +0 -2
  26. udata/tests/api/test_datasets_api.py +15 -29
  27. udata/tests/api/test_me_api.py +4 -6
  28. udata/tests/api/test_organizations_api.py +19 -38
  29. udata/tests/api/test_reports_api.py +0 -4
  30. udata/tests/api/test_reuses_api.py +9 -19
  31. udata/tests/api/test_swagger.py +2 -3
  32. udata/tests/api/test_tags_api.py +6 -7
  33. udata/tests/api/test_transfer_api.py +0 -2
  34. udata/tests/api/test_user_api.py +8 -10
  35. udata/tests/apiv2/test_datasets.py +0 -4
  36. udata/tests/apiv2/test_me_api.py +0 -2
  37. udata/tests/apiv2/test_organizations.py +0 -2
  38. udata/tests/apiv2/test_swagger.py +2 -3
  39. udata/tests/apiv2/test_topics.py +0 -2
  40. udata/tests/cli/test_cli_base.py +14 -12
  41. udata/tests/cli/test_db_cli.py +51 -54
  42. udata/tests/contact_point/test_contact_point_models.py +2 -2
  43. udata/tests/dataservice/test_csv_adapter.py +2 -5
  44. udata/tests/dataservice/test_dataservice_rdf.py +3 -6
  45. udata/tests/dataservice/test_dataservice_tasks.py +36 -38
  46. udata/tests/dataset/test_csv_adapter.py +2 -5
  47. udata/tests/dataset/test_dataset_actions.py +2 -4
  48. udata/tests/dataset/test_dataset_commands.py +2 -4
  49. udata/tests/dataset/test_dataset_events.py +3 -3
  50. udata/tests/dataset/test_dataset_model.py +6 -7
  51. udata/tests/dataset/test_dataset_rdf.py +6 -9
  52. udata/tests/dataset/test_dataset_recommendations.py +2 -2
  53. udata/tests/dataset/test_dataset_tasks.py +66 -68
  54. udata/tests/dataset/test_resource_preview.py +39 -48
  55. udata/tests/dataset/test_transport_tasks.py +2 -2
  56. udata/tests/features/territories/__init__.py +0 -6
  57. udata/tests/features/territories/test_territories_api.py +25 -24
  58. udata/tests/forms/test_current_user_field.py +2 -2
  59. udata/tests/forms/test_dict_field.py +2 -4
  60. udata/tests/forms/test_extras_fields.py +2 -3
  61. udata/tests/forms/test_image_field.py +2 -2
  62. udata/tests/forms/test_model_field.py +2 -4
  63. udata/tests/forms/test_publish_as_field.py +2 -4
  64. udata/tests/forms/test_user_forms.py +26 -29
  65. udata/tests/frontend/test_auth.py +2 -3
  66. udata/tests/frontend/test_csv.py +5 -6
  67. udata/tests/frontend/test_error_handlers.py +2 -3
  68. udata/tests/frontend/test_hooks.py +5 -7
  69. udata/tests/frontend/test_markdown.py +3 -4
  70. udata/tests/helpers.py +2 -7
  71. udata/tests/metrics/test_metrics.py +52 -48
  72. udata/tests/metrics/test_tasks.py +154 -150
  73. udata/tests/organization/test_csv_adapter.py +2 -5
  74. udata/tests/organization/test_notifications.py +2 -4
  75. udata/tests/organization/test_organization_model.py +3 -4
  76. udata/tests/organization/test_organization_rdf.py +2 -8
  77. udata/tests/plugin.py +6 -110
  78. udata/tests/reuse/test_reuse_model.py +3 -4
  79. udata/tests/site/test_site_api.py +0 -2
  80. udata/tests/site/test_site_csv_exports.py +0 -2
  81. udata/tests/site/test_site_metrics.py +2 -4
  82. udata/tests/site/test_site_model.py +2 -2
  83. udata/tests/site/test_site_rdf.py +3 -6
  84. udata/tests/test_activity.py +3 -3
  85. udata/tests/test_api_fields.py +6 -9
  86. udata/tests/test_cors.py +0 -2
  87. udata/tests/test_dcat_commands.py +2 -3
  88. udata/tests/test_discussions.py +2 -7
  89. udata/tests/test_mail.py +4 -10
  90. udata/tests/test_migrations.py +413 -419
  91. udata/tests/test_model.py +10 -11
  92. udata/tests/test_notifications.py +2 -3
  93. udata/tests/test_owned.py +3 -3
  94. udata/tests/test_routing.py +5 -5
  95. udata/tests/test_storages.py +6 -5
  96. udata/tests/test_tags.py +2 -1
  97. udata/tests/test_topics.py +2 -4
  98. udata/tests/test_transfer.py +4 -5
  99. udata/tests/topic/test_topic_tasks.py +25 -27
  100. udata/tests/user/test_user_rdf.py +2 -8
  101. udata/tests/workers/test_jobs_commands.py +2 -2
  102. udata/tests/workers/test_tasks_routing.py +27 -27
  103. {udata-12.0.2.dev17.dist-info → udata-12.0.2.dev18.dist-info}/METADATA +1 -1
  104. {udata-12.0.2.dev17.dist-info → udata-12.0.2.dev18.dist-info}/RECORD +108 -110
  105. udata/tests/frontend/__init__.py +0 -23
  106. udata/tests/metrics/conftest.py +0 -15
  107. {udata-12.0.2.dev17.dist-info → udata-12.0.2.dev18.dist-info}/WHEEL +0 -0
  108. {udata-12.0.2.dev17.dist-info → udata-12.0.2.dev18.dist-info}/entry_points.txt +0 -0
  109. {udata-12.0.2.dev17.dist-info → udata-12.0.2.dev18.dist-info}/licenses/LICENSE +0 -0
  110. {udata-12.0.2.dev17.dist-info → udata-12.0.2.dev18.dist-info}/top_level.txt +0 -0
@@ -7,6 +7,7 @@ from udata.core.storages import tmp
7
7
  from udata.forms import Form
8
8
  from udata.forms.fields import ImageField
9
9
  from udata.mongo import db
10
+ from udata.tests.api import PytestOnlyDBTestCase
10
11
  from udata.tests.helpers import data_path
11
12
 
12
13
  log = logging.getLogger(__name__)
@@ -24,8 +25,7 @@ class PostData(dict):
24
25
  return value
25
26
 
26
27
 
27
- @pytest.mark.usefixtures("clean_db")
28
- class ImageFieldTest:
28
+ class ImageFieldTest(PytestOnlyDBTestCase):
29
29
  class D(db.Document):
30
30
  image = db.ImageField(fs=storage)
31
31
  thumbnail = db.ImageField(fs=storage, thumbnails=SIZES)
@@ -1,11 +1,9 @@
1
- import pytest
2
1
  from werkzeug.datastructures import MultiDict
3
2
 
4
3
  from udata.forms import ModelForm, fields
5
4
  from udata.i18n import gettext as _
6
5
  from udata.mongo import db
7
-
8
- pytestmark = [pytest.mark.usefixtures("clean_db")]
6
+ from udata.tests.api import PytestOnlyDBTestCase
9
7
 
10
8
 
11
9
  class Target(db.Document):
@@ -233,7 +231,7 @@ class Optionnal:
233
231
  assert model.target is None
234
232
 
235
233
 
236
- class CommonMixin:
234
+ class CommonMixin(PytestOnlyDBTestCase):
237
235
  @property
238
236
  def form(self):
239
237
  validators = [fields.validators.DataRequired()] if self.required else []
@@ -1,4 +1,3 @@
1
- import pytest
2
1
  from bson import ObjectId
3
2
  from werkzeug.datastructures import MultiDict
4
3
 
@@ -8,10 +7,10 @@ from udata.core.user.factories import AdminFactory, UserFactory
8
7
  from udata.forms import ModelForm, fields
9
8
  from udata.i18n import gettext as _
10
9
  from udata.models import Member, Organization, User, db
11
- from udata.tests import TestCase
10
+ from udata.tests.api import DBTestCase
12
11
 
13
12
 
14
- class PublishFieldTest(TestCase):
13
+ class PublishFieldTest(DBTestCase):
15
14
  def factory(self, *args, **kwargs):
16
15
  class Ownable(db.Document):
17
16
  owner = db.ReferenceField(User)
@@ -194,7 +193,6 @@ class PublishFieldTest(TestCase):
194
193
  self.assertIn("organization", form.errors)
195
194
  self.assertEqual(len(form.errors["organization"]), 1)
196
195
 
197
- @pytest.mark.usefixtures("clean_db")
198
196
  def test_with_initial_and_both_member(self):
199
197
  Ownable, OwnableForm = self.factory()
200
198
  user = UserFactory()
@@ -1,34 +1,31 @@
1
- import pytest
2
-
3
1
  from udata.auth.forms import ExtendedRegisterForm
4
2
  from udata.core.user.forms import UserProfileForm
3
+ from udata.tests.api import PytestOnlyDBTestCase
5
4
 
6
- pytestmark = [pytest.mark.usefixtures("clean_db")]
7
-
8
-
9
- def test_register_form_accepts_no_url():
10
- form = ExtendedRegisterForm.from_json(
11
- {
12
- "email": "a@a.fr",
13
- "password": "passpass",
14
- "password_confirm": "passpass",
15
- "first_name": "azeaezr http://dumdum.fr",
16
- "last_name": "azeaze https://etalab.studio",
17
- }
18
- )
19
- form.validate()
20
- assert "first_name" in form.errors and "last_name" in form.errors
21
5
 
6
+ class UserFormsTest(PytestOnlyDBTestCase):
7
+ def test_register_form_accepts_no_url(self):
8
+ form = ExtendedRegisterForm.from_json(
9
+ {
10
+ "email": "a@a.fr",
11
+ "password": "passpass",
12
+ "password_confirm": "passpass",
13
+ "first_name": "azeaezr http://dumdum.fr",
14
+ "last_name": "azeaze https://etalab.studio",
15
+ }
16
+ )
17
+ form.validate()
18
+ assert "first_name" in form.errors and "last_name" in form.errors
22
19
 
23
- def test_user_profile_form_accepts_no_url():
24
- form = UserProfileForm.from_json(
25
- {
26
- "email": "a@a.fr",
27
- "password": "passpass",
28
- "password_confirm": "passpass",
29
- "first_name": "azeaezr http://dumdum.fr",
30
- "last_name": "azeaze https://etalab.studio",
31
- }
32
- )
33
- form.validate()
34
- assert "first_name" in form.errors and "last_name" in form.errors
20
+ def test_user_profile_form_accepts_no_url(self):
21
+ form = UserProfileForm.from_json(
22
+ {
23
+ "email": "a@a.fr",
24
+ "password": "passpass",
25
+ "password_confirm": "passpass",
26
+ "first_name": "azeaezr http://dumdum.fr",
27
+ "last_name": "azeaze https://etalab.studio",
28
+ }
29
+ )
30
+ form.validate()
31
+ assert "first_name" in form.errors and "last_name" in form.errors
@@ -2,11 +2,10 @@ from flask import current_app, url_for
2
2
  from flask_security.utils import hash_data
3
3
 
4
4
  from udata.core.user.factories import AdminFactory
5
+ from udata.tests.api import APITestCase
5
6
 
6
- from . import FrontTestCase
7
7
 
8
-
9
- class AuthTest(FrontTestCase):
8
+ class AuthTest(APITestCase):
10
9
  def test_change_mail(self):
11
10
  user = self.login(AdminFactory())
12
11
 
@@ -3,15 +3,15 @@ from io import StringIO
3
3
  from random import randint
4
4
 
5
5
  import factory
6
+ import pytest
6
7
  from factory.mongoengine import MongoEngineFactory
7
8
  from flask import Blueprint, url_for
8
9
 
9
10
  from udata.core import csv
10
11
  from udata.mongo import db
12
+ from udata.tests.api import APITestCase
11
13
  from udata.utils import faker
12
14
 
13
- from . import FrontTestCase
14
-
15
15
  RE_ATTACHMENT = re.compile(r"^attachment; filename=(?P<filename>.*)$")
16
16
  RE_FILENAME = re.compile(r"^(?P<basename>.*)-\d{4}-\d{2}-\d{2}-\d{2}-\d{2}\.csv$")
17
17
 
@@ -107,11 +107,10 @@ def with_basename():
107
107
  return csv.stream(adapter, "test")
108
108
 
109
109
 
110
- class CsvTest(FrontTestCase):
111
- def create_app(self):
112
- app = super(CsvTest, self).create_app()
110
+ class CsvTest(APITestCase):
111
+ @pytest.fixture(autouse=True)
112
+ def setup_func(self, app):
113
113
  app.register_blueprint(blueprint)
114
- return app
115
114
 
116
115
  def test_adapter_fields_as_list(self):
117
116
  @csv.adapter(Fake)
@@ -3,11 +3,10 @@ from uuid import uuid4
3
3
  from flask import url_for
4
4
 
5
5
  from udata.i18n import _
6
+ from udata.tests.api import APITestCase
6
7
 
7
- from . import FrontTestCase
8
8
 
9
-
10
- class ErrorHandlersTest(FrontTestCase):
9
+ class ErrorHandlersTest(APITestCase):
11
10
  def test_404_in_flask_routing_requesting_html(self):
12
11
  """Test that a 404 error displays the custom 404 HTML page"""
13
12
  # Request a non-existent page
@@ -2,6 +2,7 @@ import pytest
2
2
  from flask import Blueprint, render_template_string, url_for
3
3
 
4
4
  from udata.frontend import template_hook
5
+ from udata.tests.api import PytestOnlyAPITestCase
5
6
  from udata.tests.helpers import assert200
6
7
 
7
8
  bp = Blueprint("hooks_tests", __name__, url_prefix="/hooks_tests")
@@ -92,14 +93,11 @@ def iter_conditionnal():
92
93
  return render_template_string('{% for w in hook("conditionnal") %}<{{ w }}>{% endfor %}')
93
94
 
94
95
 
95
- @pytest.fixture
96
- def app(app):
97
- app.register_blueprint(bp)
98
- return app
96
+ class HooksTest(PytestOnlyAPITestCase):
97
+ @pytest.fixture(autouse=True)
98
+ def setup_func(self, app):
99
+ app.register_blueprint(bp)
99
100
 
100
-
101
- @pytest.mark.frontend
102
- class HooksTest:
103
101
  def test_empty_template_hook(self, client):
104
102
  response = client.get(url_for("hooks_tests.render_empty"))
105
103
  assert200(response)
@@ -3,6 +3,7 @@ from bleach._vendor import html5lib
3
3
  from flask import render_template_string
4
4
 
5
5
  from udata.frontend.markdown import EXCERPT_TOKEN, md, parse_html
6
+ from udata.tests.api import PytestOnlyAPITestCase
6
7
  from udata.utils import faker
7
8
 
8
9
  parser = html5lib.HTMLParser(tree=html5lib.getTreeBuilder("dom"))
@@ -38,8 +39,7 @@ def md2dom(app):
38
39
  return helper
39
40
 
40
41
 
41
- @pytest.mark.frontend
42
- class MarkdownTest:
42
+ class MarkdownTest(PytestOnlyAPITestCase):
43
43
  def test_excerpt_is_not_removed(self, app):
44
44
  with app.test_request_context("/"):
45
45
  assert_md_equal(md(EXCERPT_TOKEN), EXCERPT_TOKEN)
@@ -279,8 +279,7 @@ class MarkdownTest:
279
279
  assert_md(text, expected)
280
280
 
281
281
 
282
- @pytest.mark.frontend
283
- class MdStripTest:
282
+ class MdStripTest(PytestOnlyAPITestCase):
284
283
  def test_mdstrip_filter(self, app):
285
284
  """mdstrip should truncate the text before rendering"""
286
285
  text = "1 2 3 4 5 6 7 8 9 0"
udata/tests/helpers.py CHANGED
@@ -2,10 +2,10 @@ import os
2
2
  from contextlib import contextmanager
3
3
  from datetime import timedelta
4
4
  from io import BytesIO
5
- from urllib.parse import parse_qs, urljoin, urlparse
5
+ from urllib.parse import parse_qs, urlparse
6
6
 
7
7
  import mock
8
- from flask import current_app, json, request, url_for
8
+ from flask import current_app, json
9
9
  from flask_security.babel import FsDomain
10
10
  from PIL import Image
11
11
 
@@ -182,11 +182,6 @@ def assert500(response):
182
182
  assert_status(response, 500)
183
183
 
184
184
 
185
- def full_url(*args, **kwargs):
186
- """Build a full URL"""
187
- return urljoin(request.url_root, url_for(*args, **kwargs))
188
-
189
-
190
185
  def data_path(filename):
191
186
  """Get a test data path"""
192
187
  return os.path.join(os.path.dirname(__file__), "data", filename)
@@ -9,59 +9,63 @@ from udata.core.metrics.helpers import get_metrics_for_model, get_stock_metrics
9
9
  from udata.core.organization.factories import OrganizationFactory
10
10
  from udata.core.reuse.factories import ReuseFactory
11
11
  from udata.models import Dataset, Organization, Reuse
12
+ from udata.tests.api import PytestOnlyDBTestCase
12
13
 
13
14
  from .helpers import mock_monthly_metrics_payload
14
15
 
15
16
 
16
- @pytest.mark.parametrize(
17
- "target,value_keys",
18
- [
19
- ("dataset", ["visit", "download_resource"]),
20
- ("dataservice", ["visit"]),
21
- ("reuse", ["visit"]),
22
- ("organization", ["visit_dataset", "download_resource", "visit_reuse"]),
23
- ],
24
- )
25
- def test_get_metrics_for_model(app, rmock, target, value_keys):
26
- mock_monthly_metrics_payload(
27
- app, rmock, target, data=[(value_key, 2403) for value_key in value_keys]
17
+ @pytest.mark.options(METRICS_API="http://metrics-api.fr/api")
18
+ class GetStockMetricsTest(PytestOnlyDBTestCase):
19
+ @pytest.mark.parametrize(
20
+ "target,value_keys",
21
+ [
22
+ ("dataset", ["visit", "download_resource"]),
23
+ ("dataservice", ["visit"]),
24
+ ("reuse", ["visit"]),
25
+ ("organization", ["visit_dataset", "download_resource", "visit_reuse"]),
26
+ ],
28
27
  )
29
- res = get_metrics_for_model(target, "id", value_keys)
30
- for i, key in enumerate(value_keys):
31
- assert len(res[i]) == 13 # The current month as well as last year's are included
32
- assert list(res[i].values())[-1] == len(key) * 2403 + 1
33
- assert list(res[i].values())[-2] == len(key) * 2403
28
+ def test_get_metrics_for_model(self, app, rmock, target, value_keys):
29
+ mock_monthly_metrics_payload(
30
+ app, rmock, target, data=[(value_key, 2403) for value_key in value_keys]
31
+ )
32
+ res = get_metrics_for_model(target, "id", value_keys)
33
+ for i, key in enumerate(value_keys):
34
+ assert len(res[i]) == 13 # The current month as well as last year's are included
35
+ assert list(res[i].values())[-1] == len(key) * 2403 + 1
36
+ assert list(res[i].values())[-2] == len(key) * 2403
34
37
 
38
+ def test_get_metrics_for_site(self, app, rmock):
39
+ value_keys = [
40
+ "visit_dataset",
41
+ "download_resource",
42
+ ]
43
+ url = f"{app.config['METRICS_API']}/site/data/?metric_month__sort=desc"
44
+ mock_monthly_metrics_payload(
45
+ app, rmock, "site", data=[(value_key, 2403) for value_key in value_keys], url=url
46
+ )
47
+ res = get_metrics_for_model("site", None, value_keys)
48
+ for i, key in enumerate(value_keys):
49
+ assert len(res[i]) == 13 # The current month as well as last year's are included
50
+ assert list(res[i].values())[-1] == len(key) * 2403 + 1
51
+ assert list(res[i].values())[-2] == len(key) * 2403
35
52
 
36
- def test_get_metrics_for_site(app, rmock):
37
- value_keys = [
38
- "visit_dataset",
39
- "download_resource",
40
- ]
41
- url = f"{app.config['METRICS_API']}/site/data/?metric_month__sort=desc"
42
- mock_monthly_metrics_payload(
43
- app, rmock, "site", data=[(value_key, 2403) for value_key in value_keys], url=url
53
+ @pytest.mark.parametrize(
54
+ "model,factory,date_label",
55
+ [
56
+ (Dataset, DatasetFactory, "created_at_internal"),
57
+ (Dataservice, DataserviceFactory, "created_at"),
58
+ (Reuse, ReuseFactory, "created_at"),
59
+ (Organization, OrganizationFactory, "created_at"),
60
+ ],
44
61
  )
45
- res = get_metrics_for_model("site", None, value_keys)
46
- for i, key in enumerate(value_keys):
47
- assert len(res[i]) == 13 # The current month as well as last year's are included
48
- assert list(res[i].values())[-1] == len(key) * 2403 + 1
49
- assert list(res[i].values())[-2] == len(key) * 2403
50
-
51
-
52
- @pytest.mark.parametrize(
53
- "model,factory,date_label",
54
- [
55
- (Dataset, DatasetFactory, "created_at_internal"),
56
- (Dataservice, DataserviceFactory, "created_at"),
57
- (Reuse, ReuseFactory, "created_at"),
58
- (Organization, OrganizationFactory, "created_at"),
59
- ],
60
- )
61
- def test_get_stock_metrics(app, clean_db, model, factory, date_label):
62
- [factory() for i in range(10)]
63
- [factory(**{date_label: datetime.now().replace(day=1) - timedelta(days=1)}) for i in range(8)]
64
- res = get_stock_metrics(model.objects(), date_label)
65
- assert list(res.values())[-1] == 10
66
- assert list(res.values())[-2] == 8
67
- assert list(res.values())[-3] == 0
62
+ def test_get_stock_metrics(self, model, factory, date_label):
63
+ [factory() for i in range(10)]
64
+ [
65
+ factory(**{date_label: datetime.now().replace(day=1) - timedelta(days=1)})
66
+ for i in range(8)
67
+ ]
68
+ res = get_stock_metrics(model.objects(), date_label)
69
+ assert list(res.values())[-1] == 10
70
+ assert list(res.values())[-2] == 8
71
+ assert list(res.values())[-3] == 0