Skip to content

Commit 874c3b2

Browse files
authored
tests: address randomness-related failures (#15469)
* test: update test to sort the same way as code The `_simple_detail()` function has sorted the results by version, then filename, so update test conditions to sort similarly as well. Exposed with: --randomly-seed=105155306 --randomly-seed=1843708888 --randomly-seed=19699634 Signed-off-by: Mike Fiedler <[email protected]> * test: actually assert things Signed-off-by: Mike Fiedler <[email protected]> * test: use a paginated page in test Other tests paginating expect a page-like object instead of the list of items, so supply one. Exposed via: --randomly-seed=3227833760 --randomly-seed=235656747 Signed-off-by: Mike Fiedler <[email protected]> * test: remove db-controlled sequence from factory When using `factory.Sequence()` for a database-controlled sequence column, we can get into a weird state where we're reusing the sequence since we've flushed already. Since we already rely on the database to generate the ID for us, we don't have to supply it ourselves as part of the factory. If we ever *do* want to set a specific id for a JournalEntry, we would use a keyword argument like `JournalEntryFactory.create(id=...)` Exposed via: --randomly-seed=2329742959 Signed-off-by: Mike Fiedler <[email protected]> --------- Signed-off-by: Mike Fiedler <[email protected]>
1 parent 675794b commit 874c3b2

File tree

3 files changed

+30
-14
lines changed

3 files changed

+30
-14
lines changed

tests/common/db/packaging.py

-1
Original file line numberDiff line numberDiff line change
@@ -178,7 +178,6 @@ class JournalEntryFactory(WarehouseFactory):
178178
class Meta:
179179
model = JournalEntry
180180

181-
id = factory.Sequence(lambda n: n)
182181
name = factory.Faker("word")
183182
version = factory.Sequence(lambda n: str(n) + ".0")
184183
submitted_date = factory.Faker(

tests/unit/admin/views/test_projects.py

+19-2
Original file line numberDiff line numberDiff line change
@@ -17,14 +17,17 @@
1717
import pretend
1818
import pytest
1919

20+
from paginate_sqlalchemy import SqlalchemyOrmPage
2021
from pyramid.httpexceptions import HTTPBadRequest, HTTPMovedPermanently, HTTPSeeOther
22+
from sqlalchemy.orm import joinedload
2123

2224
from tests.common.db.oidc import GitHubPublisherFactory
2325
from warehouse.admin.views import projects as views
2426
from warehouse.observations.models import ObservationKind
2527
from warehouse.packaging.models import Project, Role
2628
from warehouse.packaging.tasks import update_release_description
2729
from warehouse.search.tasks import reindex_project
30+
from warehouse.utils.paginate import paginate_url_factory
2831

2932
from ....common.db.accounts import UserFactory
3033
from ....common.db.observations import ObserverFactory
@@ -433,18 +436,32 @@ def test_with_page(self, db_request):
433436
observer = ObserverFactory.create()
434437
UserFactory.create(observer=observer)
435438
project = ProjectFactory.create()
436-
observations = ProjectObservationFactory.create_batch(
439+
ProjectObservationFactory.create_batch(
437440
size=30, related=project, observer=observer
438441
)
439442

443+
observations_query = (
444+
db_request.db.query(project.Observation)
445+
.options(joinedload(project.Observation.observer))
446+
.filter(project.Observation.related == project)
447+
.order_by(project.Observation.created.desc())
448+
)
449+
observations_page = SqlalchemyOrmPage(
450+
observations_query,
451+
page=2,
452+
items_per_page=25,
453+
url_maker=paginate_url_factory(db_request),
454+
)
455+
440456
db_request.matchdict["project_name"] = project.normalized_name
441457
db_request.GET["page"] = "2"
442458
result = views.project_observations_list(project, db_request)
443459

444460
assert result == {
445-
"observations": observations[25:],
461+
"observations": observations_page,
446462
"project": project,
447463
}
464+
assert len(observations_page.items) == 5
448465

449466
def test_with_invalid_page(self, db_request):
450467
project = ProjectFactory.create()

tests/unit/api/test_simple.py

+11-11
Original file line numberDiff line numberDiff line change
@@ -102,7 +102,7 @@ def test_no_results_no_serial(self, db_request, content_type, renderer_override)
102102
_assert_has_cors_headers(db_request.response.headers)
103103

104104
if renderer_override is not None:
105-
db_request.override_renderer == renderer_override
105+
assert db_request.override_renderer == renderer_override
106106

107107
@pytest.mark.parametrize(
108108
"content_type,renderer_override",
@@ -121,7 +121,7 @@ def test_no_results_with_serial(self, db_request, content_type, renderer_overrid
121121
_assert_has_cors_headers(db_request.response.headers)
122122

123123
if renderer_override is not None:
124-
db_request.override_renderer == renderer_override
124+
assert db_request.override_renderer == renderer_override
125125

126126
@pytest.mark.parametrize(
127127
"content_type,renderer_override",
@@ -142,7 +142,7 @@ def test_with_results_no_serial(self, db_request, content_type, renderer_overrid
142142
_assert_has_cors_headers(db_request.response.headers)
143143

144144
if renderer_override is not None:
145-
db_request.override_renderer == renderer_override
145+
assert db_request.override_renderer == renderer_override
146146

147147
@pytest.mark.parametrize(
148148
"content_type,renderer_override",
@@ -168,7 +168,7 @@ def test_with_results_with_serial(
168168
_assert_has_cors_headers(db_request.response.headers)
169169

170170
if renderer_override is not None:
171-
db_request.override_renderer == renderer_override
171+
assert db_request.override_renderer == renderer_override
172172

173173

174174
class TestSimpleDetail:
@@ -210,7 +210,7 @@ def test_no_files_no_serial(self, db_request, content_type, renderer_override):
210210
_assert_has_cors_headers(db_request.response.headers)
211211

212212
if renderer_override is not None:
213-
db_request.override_renderer == renderer_override
213+
assert db_request.override_renderer == renderer_override
214214

215215
@pytest.mark.parametrize(
216216
"content_type,renderer_override",
@@ -235,7 +235,7 @@ def test_no_files_with_serial(self, db_request, content_type, renderer_override)
235235
_assert_has_cors_headers(db_request.response.headers)
236236

237237
if renderer_override is not None:
238-
db_request.override_renderer == renderer_override
238+
assert db_request.override_renderer == renderer_override
239239

240240
@pytest.mark.parametrize(
241241
"content_type,renderer_override",
@@ -250,8 +250,8 @@ def test_with_files_no_serial(self, db_request, content_type, renderer_override)
250250
FileFactory.create(release=r, filename=f"{project.name}-{r.version}.tar.gz")
251251
for r in releases
252252
]
253-
# let's assert the result is ordered by string comparison of filename
254-
files = sorted(files, key=lambda key: key.filename)
253+
# let's assert the result is ordered by string comparison of version, filename
254+
files = sorted(files, key=lambda f: (parse(f.release.version), f.filename))
255255
urls_iter = (f"/file/{f.filename}" for f in files)
256256
db_request.matchdict["name"] = project.normalized_name
257257
db_request.route_url = lambda *a, **kw: next(urls_iter)
@@ -283,7 +283,7 @@ def test_with_files_no_serial(self, db_request, content_type, renderer_override)
283283
_assert_has_cors_headers(db_request.response.headers)
284284

285285
if renderer_override is not None:
286-
db_request.override_renderer == renderer_override
286+
assert db_request.override_renderer == renderer_override
287287

288288
@pytest.mark.parametrize(
289289
"content_type,renderer_override",
@@ -331,7 +331,7 @@ def test_with_files_with_serial(self, db_request, content_type, renderer_overrid
331331
_assert_has_cors_headers(db_request.response.headers)
332332

333333
if renderer_override is not None:
334-
db_request.override_renderer == renderer_override
334+
assert db_request.override_renderer == renderer_override
335335

336336
@pytest.mark.parametrize(
337337
"content_type,renderer_override",
@@ -424,4 +424,4 @@ def test_with_files_with_version_multi_digit(
424424
_assert_has_cors_headers(db_request.response.headers)
425425

426426
if renderer_override is not None:
427-
db_request.override_renderer == renderer_override
427+
assert db_request.override_renderer == renderer_override

0 commit comments

Comments
 (0)