udata 12.0.2.dev16__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 (116) hide show
  1. udata/commands/tests/test_fixtures.py +6 -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/forms/fields.py +3 -3
  10. udata/forms/widgets.py +2 -2
  11. udata/harvest/tests/ckan/test_ckan_backend.py +300 -337
  12. udata/harvest/tests/ckan/test_ckan_backend_errors.py +94 -99
  13. udata/harvest/tests/ckan/test_ckan_backend_filters.py +128 -122
  14. udata/harvest/tests/ckan/test_dkan_backend.py +39 -51
  15. udata/harvest/tests/test_actions.py +7 -7
  16. udata/harvest/tests/test_api.py +2 -4
  17. udata/harvest/tests/test_base_backend.py +3 -4
  18. udata/harvest/tests/test_dcat_backend.py +5 -16
  19. udata/harvest/tests/test_models.py +2 -4
  20. udata/harvest/tests/test_notifications.py +2 -4
  21. udata/harvest/tests/test_tasks.py +2 -3
  22. udata/mongo/taglist_field.py +3 -3
  23. udata/settings.py +3 -0
  24. udata/tags.py +5 -5
  25. udata/tests/__init__.py +40 -58
  26. udata/tests/api/__init__.py +87 -2
  27. udata/tests/api/test_activities_api.py +17 -23
  28. udata/tests/api/test_auth_api.py +2 -4
  29. udata/tests/api/test_contact_points.py +48 -54
  30. udata/tests/api/test_dataservices_api.py +0 -2
  31. udata/tests/api/test_datasets_api.py +27 -49
  32. udata/tests/api/test_me_api.py +4 -6
  33. udata/tests/api/test_organizations_api.py +19 -38
  34. udata/tests/api/test_reports_api.py +0 -4
  35. udata/tests/api/test_reuses_api.py +9 -19
  36. udata/tests/api/test_swagger.py +2 -3
  37. udata/tests/api/test_tags_api.py +6 -7
  38. udata/tests/api/test_transfer_api.py +0 -2
  39. udata/tests/api/test_user_api.py +8 -10
  40. udata/tests/apiv2/test_datasets.py +0 -4
  41. udata/tests/apiv2/test_me_api.py +0 -2
  42. udata/tests/apiv2/test_organizations.py +0 -2
  43. udata/tests/apiv2/test_swagger.py +2 -3
  44. udata/tests/apiv2/test_topics.py +0 -2
  45. udata/tests/cli/test_cli_base.py +14 -12
  46. udata/tests/cli/test_db_cli.py +51 -54
  47. udata/tests/contact_point/test_contact_point_models.py +2 -2
  48. udata/tests/dataservice/test_csv_adapter.py +2 -5
  49. udata/tests/dataservice/test_dataservice_rdf.py +3 -6
  50. udata/tests/dataservice/test_dataservice_tasks.py +36 -38
  51. udata/tests/dataset/test_csv_adapter.py +2 -5
  52. udata/tests/dataset/test_dataset_actions.py +2 -4
  53. udata/tests/dataset/test_dataset_commands.py +2 -4
  54. udata/tests/dataset/test_dataset_events.py +3 -3
  55. udata/tests/dataset/test_dataset_model.py +6 -7
  56. udata/tests/dataset/test_dataset_rdf.py +6 -9
  57. udata/tests/dataset/test_dataset_recommendations.py +2 -2
  58. udata/tests/dataset/test_dataset_tasks.py +66 -68
  59. udata/tests/dataset/test_resource_preview.py +39 -48
  60. udata/tests/dataset/test_transport_tasks.py +2 -2
  61. udata/tests/features/territories/__init__.py +0 -6
  62. udata/tests/features/territories/test_territories_api.py +25 -24
  63. udata/tests/forms/test_current_user_field.py +2 -2
  64. udata/tests/forms/test_dict_field.py +2 -4
  65. udata/tests/forms/test_extras_fields.py +2 -3
  66. udata/tests/forms/test_image_field.py +2 -2
  67. udata/tests/forms/test_model_field.py +2 -4
  68. udata/tests/forms/test_publish_as_field.py +2 -4
  69. udata/tests/forms/test_user_forms.py +26 -29
  70. udata/tests/frontend/test_auth.py +2 -3
  71. udata/tests/frontend/test_csv.py +5 -6
  72. udata/tests/frontend/test_error_handlers.py +2 -3
  73. udata/tests/frontend/test_hooks.py +5 -7
  74. udata/tests/frontend/test_markdown.py +3 -4
  75. udata/tests/helpers.py +2 -7
  76. udata/tests/metrics/test_metrics.py +52 -48
  77. udata/tests/metrics/test_tasks.py +154 -150
  78. udata/tests/organization/test_csv_adapter.py +2 -5
  79. udata/tests/organization/test_notifications.py +2 -4
  80. udata/tests/organization/test_organization_model.py +3 -4
  81. udata/tests/organization/test_organization_rdf.py +2 -8
  82. udata/tests/plugin.py +6 -110
  83. udata/tests/reuse/test_reuse_model.py +3 -4
  84. udata/tests/site/test_site_api.py +0 -2
  85. udata/tests/site/test_site_csv_exports.py +0 -2
  86. udata/tests/site/test_site_metrics.py +2 -4
  87. udata/tests/site/test_site_model.py +2 -2
  88. udata/tests/site/test_site_rdf.py +3 -6
  89. udata/tests/test_activity.py +3 -3
  90. udata/tests/test_api_fields.py +6 -9
  91. udata/tests/test_cors.py +0 -2
  92. udata/tests/test_dcat_commands.py +2 -3
  93. udata/tests/test_discussions.py +2 -7
  94. udata/tests/test_mail.py +4 -10
  95. udata/tests/test_migrations.py +413 -419
  96. udata/tests/test_model.py +10 -11
  97. udata/tests/test_notifications.py +2 -3
  98. udata/tests/test_owned.py +3 -3
  99. udata/tests/test_routing.py +5 -5
  100. udata/tests/test_storages.py +6 -5
  101. udata/tests/test_tags.py +2 -4
  102. udata/tests/test_topics.py +2 -4
  103. udata/tests/test_transfer.py +4 -5
  104. udata/tests/topic/test_topic_tasks.py +25 -27
  105. udata/tests/user/test_user_rdf.py +2 -8
  106. udata/tests/workers/test_jobs_commands.py +2 -2
  107. udata/tests/workers/test_tasks_routing.py +27 -27
  108. udata/utils.py +1 -1
  109. {udata-12.0.2.dev16.dist-info → udata-12.0.2.dev18.dist-info}/METADATA +1 -1
  110. {udata-12.0.2.dev16.dist-info → udata-12.0.2.dev18.dist-info}/RECORD +114 -116
  111. udata/tests/frontend/__init__.py +0 -23
  112. udata/tests/metrics/conftest.py +0 -15
  113. {udata-12.0.2.dev16.dist-info → udata-12.0.2.dev18.dist-info}/WHEEL +0 -0
  114. {udata-12.0.2.dev16.dist-info → udata-12.0.2.dev18.dist-info}/entry_points.txt +0 -0
  115. {udata-12.0.2.dev16.dist-info → udata-12.0.2.dev18.dist-info}/licenses/LICENSE +0 -0
  116. {udata-12.0.2.dev16.dist-info → udata-12.0.2.dev18.dist-info}/top_level.txt +0 -0
@@ -1,18 +1,19 @@
1
+ import pytest
1
2
  from flask import url_for
2
3
 
3
4
  from udata.core.spatial.factories import GeoZoneFactory
4
5
  from udata.tests.api import APITestCase
5
6
  from udata.tests.features.territories import (
6
- TerritoriesSettings,
7
7
  create_geozones_fixtures,
8
8
  create_old_new_regions_fixtures,
9
9
  )
10
10
 
11
11
 
12
+ @pytest.mark.options(
13
+ ACTIVATE_TERRITORIES=True,
14
+ HANDLED_LEVELS=("fr:commune", "fr:departement", "fr:region", "country"),
15
+ )
12
16
  class TerritoriesAPITest(APITestCase):
13
- modules = []
14
- settings = TerritoriesSettings
15
-
16
17
  def setUp(self):
17
18
  self.paca, self.bdr, self.arles = create_geozones_fixtures()
18
19
 
@@ -21,15 +22,15 @@ class TerritoriesAPITest(APITestCase):
21
22
  self.assert400(response)
22
23
 
23
24
  def test_suggest_empty(self):
24
- response = self.get(url_for("api.suggest_territory"), qs={"q": "tes"})
25
+ response = self.get(url_for("api.suggest_territory", q="tes"))
25
26
  self.assert200(response)
26
27
  self.assertEqual(response.json, [])
27
- response = self.get(url_for("api.suggest_territory"), qs={"q": "test"})
28
+ response = self.get(url_for("api.suggest_territory", q="test"))
28
29
  self.assert200(response)
29
30
  self.assertEqual(response.json, [])
30
31
 
31
32
  def test_suggest_town(self):
32
- response = self.get(url_for("api.suggest_territory"), qs={"q": "arle"})
33
+ response = self.get(url_for("api.suggest_territory", q="arle"))
33
34
  self.assert200(response)
34
35
  result = response.json[0]
35
36
  self.assertEqual(result["title"], self.arles.name)
@@ -37,7 +38,7 @@ class TerritoriesAPITest(APITestCase):
37
38
  self.assertIn("page", result)
38
39
 
39
40
  def test_suggest_town_five_letters(self):
40
- response = self.get(url_for("api.suggest_territory"), qs={"q": "arles"})
41
+ response = self.get(url_for("api.suggest_territory", q="arles"))
41
42
  self.assert200(response)
42
43
  result = response.json[0]
43
44
  self.assertEqual(result["title"], self.arles.name)
@@ -45,7 +46,7 @@ class TerritoriesAPITest(APITestCase):
45
46
  self.assertIn("page", result)
46
47
 
47
48
  def test_suggest_town_by_insee_code(self):
48
- response = self.get(url_for("api.suggest_territory"), qs={"q": "13004"})
49
+ response = self.get(url_for("api.suggest_territory", q="13004"))
49
50
  self.assert200(response)
50
51
  result = response.json[0]
51
52
  self.assertEqual(result["id"], self.arles.id)
@@ -55,7 +56,7 @@ class TerritoriesAPITest(APITestCase):
55
56
  arles_sur_tech = GeoZoneFactory(
56
57
  id="fr:commune:66009", level="fr:commune", name="Arles-sur-Tech", code="66009"
57
58
  )
58
- response = self.get(url_for("api.suggest_territory"), qs={"q": "arles"})
59
+ response = self.get(url_for("api.suggest_territory", q="arles"))
59
60
  self.assert200(response)
60
61
  results = response.json
61
62
  self.assertEqual(len(results), 2)
@@ -64,7 +65,7 @@ class TerritoriesAPITest(APITestCase):
64
65
  self.assertEqual(results[1]["id"], arles_sur_tech.id)
65
66
 
66
67
  def test_suggest_county(self):
67
- response = self.get(url_for("api.suggest_territory"), qs={"q": "bouche"})
68
+ response = self.get(url_for("api.suggest_territory", q="bouche"))
68
69
  self.assert200(response)
69
70
  result = response.json[0]
70
71
  self.assertEqual(result["title"], self.bdr.name)
@@ -72,7 +73,7 @@ class TerritoriesAPITest(APITestCase):
72
73
  self.assertIn("page", result)
73
74
 
74
75
  def test_suggest_region(self):
75
- response = self.get(url_for("api.suggest_territory"), qs={"q": "prov"})
76
+ response = self.get(url_for("api.suggest_territory", q="prov"))
76
77
  self.assert200(response)
77
78
  result = response.json[0]
78
79
  self.assertEqual(result["title"], self.paca.name)
@@ -81,7 +82,7 @@ class TerritoriesAPITest(APITestCase):
81
82
 
82
83
  def test_suggest_old_new_region(self):
83
84
  lr, occitanie = create_old_new_regions_fixtures()
84
- response = self.get(url_for("api.suggest_territory"), qs={"q": "langue"})
85
+ response = self.get(url_for("api.suggest_territory", q="langue"))
85
86
  self.assert200(response)
86
87
  self.assertEqual(len(response.json), 2)
87
88
  result = response.json[0]
@@ -92,7 +93,7 @@ class TerritoriesAPITest(APITestCase):
92
93
  self.assertEqual(result["id"], lr.id)
93
94
 
94
95
  def test_suggest_county_by_id(self):
95
- response = self.get(url_for("api.suggest_territory"), qs={"q": "13"})
96
+ response = self.get(url_for("api.suggest_territory", q="13"))
96
97
  self.assert200(response)
97
98
  result = response.json[0]
98
99
  self.assertEqual(result["id"], self.bdr.id)
@@ -102,7 +103,7 @@ class TerritoriesAPITest(APITestCase):
102
103
  bouchet = GeoZoneFactory(
103
104
  id="fr:commune:26054", level="fr:commune", name="Bouchet", code="26054"
104
105
  )
105
- response = self.get(url_for("api.suggest_territory"), qs={"q": "bouche"})
106
+ response = self.get(url_for("api.suggest_territory", q="bouche"))
106
107
  self.assert200(response)
107
108
  results = response.json
108
109
  self.assertEqual(len(results), 2)
@@ -114,7 +115,7 @@ class TerritoriesAPITest(APITestCase):
114
115
  guyane = GeoZoneFactory(
115
116
  id="fr:departement:973", level="fr:departement", name="Guyane", code="973"
116
117
  )
117
- response = self.get(url_for("api.suggest_territory"), qs={"q": "guya"})
118
+ response = self.get(url_for("api.suggest_territory", q="guya"))
118
119
  self.assert200(response)
119
120
  results = response.json
120
121
  self.assertEqual(len(results), 1)
@@ -124,7 +125,7 @@ class TerritoriesAPITest(APITestCase):
124
125
  guyane = GeoZoneFactory(
125
126
  id="fr:departement:973", level="fr:departement", name="Guyane", code="973"
126
127
  )
127
- response = self.get(url_for("api.suggest_territory"), qs={"q": "973"})
128
+ response = self.get(url_for("api.suggest_territory", q="973"))
128
129
  self.assert200(response)
129
130
  results = response.json
130
131
  self.assertEqual(len(results), 1)
@@ -134,7 +135,7 @@ class TerritoriesAPITest(APITestCase):
134
135
  bastia = GeoZoneFactory(
135
136
  id="fr:commune:2b033", level="fr:commune", name="Bastia", code="2b033"
136
137
  )
137
- response = self.get(url_for("api.suggest_territory"), qs={"q": "basti"})
138
+ response = self.get(url_for("api.suggest_territory", q="basti"))
138
139
  self.assert200(response)
139
140
  results = response.json
140
141
  self.assertEqual(len(results), 1)
@@ -144,7 +145,7 @@ class TerritoriesAPITest(APITestCase):
144
145
  bastia = GeoZoneFactory(
145
146
  id="fr:commune:2b033", level="fr:commune", name="Bastia", code="2b033"
146
147
  )
147
- response = self.get(url_for("api.suggest_territory"), qs={"q": "2b033"})
148
+ response = self.get(url_for("api.suggest_territory", q="2b033"))
148
149
  self.assert200(response)
149
150
  results = response.json
150
151
  self.assertEqual(len(results), 1)
@@ -154,7 +155,7 @@ class TerritoriesAPITest(APITestCase):
154
155
  haute_corse = GeoZoneFactory(
155
156
  id="fr:departement:2b", level="fr:departement", name="Haute-Corse", code="2b"
156
157
  )
157
- response = self.get(url_for("api.suggest_territory"), qs={"q": "2b"})
158
+ response = self.get(url_for("api.suggest_territory", q="2b"))
158
159
  self.assert200(response)
159
160
  results = response.json
160
161
  self.assertEqual(len(results), 1)
@@ -162,21 +163,21 @@ class TerritoriesAPITest(APITestCase):
162
163
 
163
164
  def test_not_suggest_country(self):
164
165
  GeoZoneFactory(id="country:fr", level="country", name="France")
165
- response = self.get(url_for("api.suggest_territory"), qs={"q": "fra"})
166
+ response = self.get(url_for("api.suggest_territory", q="fra"))
166
167
  self.assert200(response)
167
168
  results = response.json
168
169
  self.assertEqual(len(results), 0)
169
- response = self.get(url_for("api.suggest_territory"), qs={"q": "fran"})
170
+ response = self.get(url_for("api.suggest_territory", q="fran"))
170
171
  self.assert200(response)
171
172
  results = response.json
172
173
  self.assertEqual(len(results), 0)
173
- response = self.get(url_for("api.suggest_territory"), qs={"q": "franc"})
174
+ response = self.get(url_for("api.suggest_territory", q="franc"))
174
175
  self.assert200(response)
175
176
  results = response.json
176
177
  self.assertEqual(len(results), 0)
177
178
 
178
179
  def test_suggest_unicode(self):
179
- response = self.get(url_for("api.suggest_territory"), qs={"q": "Bouches-du-Rhône"})
180
+ response = self.get(url_for("api.suggest_territory", q="Bouches-du-Rhône"))
180
181
  self.assert200(response)
181
182
  result = response.json[0]
182
183
  self.assertEqual(result["title"], self.bdr.name)
@@ -9,11 +9,11 @@ from udata.core.user.factories import AdminFactory, UserFactory
9
9
  from udata.forms import ModelForm, fields
10
10
  from udata.i18n import gettext as _
11
11
  from udata.models import User, db
12
- from udata.tests import DBTestMixin, TestCase
12
+ from udata.tests.api import DBTestCase
13
13
  from udata.tests.helpers import security_gettext
14
14
 
15
15
 
16
- class CurrentUserFieldTest(TestCase, DBTestMixin):
16
+ class CurrentUserFieldTest(DBTestCase):
17
17
  def factory(self, *args, **kwargs):
18
18
  class Ownable(db.Document):
19
19
  owner = db.ReferenceField(User)
@@ -1,15 +1,13 @@
1
1
  from datetime import date, datetime
2
2
 
3
- import pytest
4
3
  from werkzeug.datastructures import MultiDict
5
4
 
6
5
  from udata.forms import ModelForm, fields
7
6
  from udata.mongo import db
7
+ from udata.tests import PytestOnlyTestCase
8
8
 
9
- pytestmark = [pytest.mark.usefixtures("app")]
10
9
 
11
-
12
- class DictFieldTest:
10
+ class DictFieldTest(PytestOnlyTestCase):
13
11
  def factory(self):
14
12
  class Fake(db.Document):
15
13
  raw = db.DictField()
@@ -6,11 +6,10 @@ from werkzeug.datastructures import MultiDict
6
6
 
7
7
  from udata.forms import ModelForm, fields
8
8
  from udata.mongo import db
9
+ from udata.tests import PytestOnlyTestCase
9
10
 
10
- pytestmark = [pytest.mark.usefixtures("app")]
11
11
 
12
-
13
- class ExtrasFieldTest:
12
+ class ExtrasFieldTest(PytestOnlyTestCase):
14
13
  def factory(self):
15
14
  class Fake(db.Document):
16
15
  extras = db.ExtrasField()
@@ -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