Merge ~cjwatson/launchpad:reliable-test-latest-log into launchpad:master

Proposed by Colin Watson
Status: Merged
Approved by: Colin Watson
Approved revision: 902a6a23bfae8538cf3cb85a582989e10dbe8a2e
Merge reported by: Otto Co-Pilot
Merged at revision: not available
Proposed branch: ~cjwatson/launchpad:reliable-test-latest-log
Merge into: launchpad:master
Diff against target: 144 lines (+31/-13)
4 files modified
lib/lp/code/interfaces/revisionstatus.py (+1/-1)
lib/lp/code/model/revisionstatus.py (+9/-5)
lib/lp/code/model/tests/test_revisionstatus.py (+19/-6)
lib/lp/testing/factory.py (+2/-1)
Reviewer Review Type Date Requested Status
Andrey Fedoseev (community) Approve
Review via email: mp+429370@code.launchpad.net

Commit message

Make TestRevisionStatusReport.test_latest_log reliable

Description of the change

`RevisionStatusArtifact`s created in the same transaction have the same creation date by default. Override this so that `latest_log` has a predictable result.

To post a comment you must log in.
Revision history for this message
Andrey Fedoseev (andrey-fedoseev) :
review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1diff --git a/lib/lp/code/interfaces/revisionstatus.py b/lib/lp/code/interfaces/revisionstatus.py
2index 7c05797..c0303bb 100644
3--- a/lib/lp/code/interfaces/revisionstatus.py
4+++ b/lib/lp/code/interfaces/revisionstatus.py
5@@ -313,7 +313,7 @@ class IRevisionStatusReportSet(Interface):
6 class IRevisionStatusArtifactSet(Interface):
7 """The set of all revision status artifacts."""
8
9- def new(lfa, report, artifact_type):
10+ def new(lfa, report, artifact_type, date_created=None):
11 """Return a new revision status artifact.
12
13 :param lfa: An `ILibraryFileAlias`.
14diff --git a/lib/lp/code/model/revisionstatus.py b/lib/lp/code/model/revisionstatus.py
15index ebc5914..518c5a8 100644
16--- a/lib/lp/code/model/revisionstatus.py
17+++ b/lib/lp/code/model/revisionstatus.py
18@@ -25,7 +25,7 @@ from lp.code.interfaces.revisionstatus import (
19 IRevisionStatusReport,
20 IRevisionStatusReportSet,
21 )
22-from lp.services.database.constants import UTC_NOW
23+from lp.services.database.constants import DEFAULT, UTC_NOW
24 from lp.services.database.enumcol import DBEnum
25 from lp.services.database.interfaces import IStore
26 from lp.services.database.sqlbase import convert_storm_clause_to_string
27@@ -303,12 +303,14 @@ class RevisionStatusArtifact(StormBase):
28 name="date_created", tzinfo=pytz.UTC, allow_none=True
29 )
30
31- def __init__(self, library_file, report, artifact_type):
32+ def __init__(
33+ self, library_file, report, artifact_type, date_created=DEFAULT
34+ ):
35 super().__init__()
36 self.library_file = library_file
37 self.report = report
38 self.artifact_type = artifact_type
39- self.date_created = UTC_NOW
40+ self.date_created = date_created
41
42 @property
43 def download_url(self):
44@@ -336,10 +338,12 @@ class RevisionStatusArtifact(StormBase):
45
46 @implementer(IRevisionStatusArtifactSet)
47 class RevisionStatusArtifactSet:
48- def new(self, lfa, report, artifact_type):
49+ def new(self, lfa, report, artifact_type, date_created=DEFAULT):
50 """See `IRevisionStatusArtifactSet`."""
51 store = IStore(RevisionStatusArtifact)
52- artifact = RevisionStatusArtifact(lfa, report, artifact_type)
53+ artifact = RevisionStatusArtifact(
54+ lfa, report, artifact_type, date_created=date_created
55+ )
56 store.add(artifact)
57 return artifact
58
59diff --git a/lib/lp/code/model/tests/test_revisionstatus.py b/lib/lp/code/model/tests/test_revisionstatus.py
60index fa292a9..afc7ff2 100644
61--- a/lib/lp/code/model/tests/test_revisionstatus.py
62+++ b/lib/lp/code/model/tests/test_revisionstatus.py
63@@ -6,10 +6,12 @@
64 import hashlib
65 import io
66 import os
67+from datetime import timedelta
68 from hashlib import sha1
69
70 import requests
71 from fixtures import FakeLogger, TempDir
72+from storm.expr import Cast
73 from storm.store import Store
74 from testtools.matchers import (
75 AnyMatch,
76@@ -29,6 +31,7 @@ from lp.code.interfaces.revisionstatus import (
77 IRevisionStatusReportSet,
78 )
79 from lp.services.auth.enums import AccessTokenScope
80+from lp.services.database.constants import DEFAULT, UTC_NOW
81 from lp.services.osutils import write_file
82 from lp.services.webapp.authorization import check_permission
83 from lp.testing import (
84@@ -45,11 +48,16 @@ from lp.testing.pages import webservice_for_person
85 class TestRevisionStatusReport(TestCaseWithFactory):
86 layer = DatabaseFunctionalLayer
87
88- def makeRevisionStatusArtifact(self, report, artifact_type=None):
89+ def makeRevisionStatusArtifact(
90+ self, report, artifact_type=None, date_created=DEFAULT
91+ ):
92 # We don't need to upload files to the librarian in this test suite.
93 lfa = self.factory.makeLibraryFileAlias(db_only=True)
94 return self.factory.makeRevisionStatusArtifact(
95- lfa=lfa, report=report, artifact_type=artifact_type
96+ lfa=lfa,
97+ report=report,
98+ artifact_type=artifact_type,
99+ date_created=date_created,
100 )
101
102 def test_owner_public(self):
103@@ -165,11 +173,16 @@ class TestRevisionStatusReport(TestCaseWithFactory):
104
105 def test_latest_log(self):
106 report = self.factory.makeRevisionStatusReport()
107- self.makeRevisionStatusArtifact(report=report)
108- self.makeRevisionStatusArtifact(report=report)
109- artifact3 = self.makeRevisionStatusArtifact(report=report)
110+ artifacts = [
111+ self.makeRevisionStatusArtifact(
112+ report=report,
113+ date_created=UTC_NOW
114+ - Cast(timedelta(seconds=age), "interval"),
115+ )
116+ for age in (2, 1, 0)
117+ ]
118 with person_logged_in(report.git_repository.owner):
119- self.assertEqual(artifact3, report.latest_log)
120+ self.assertEqual(artifacts[-1], report.latest_log)
121
122
123 class TestRevisionStatusReportWebservice(TestCaseWithFactory):
124diff --git a/lib/lp/testing/factory.py b/lib/lp/testing/factory.py
125index 1f32ed9..1667cfd 100644
126--- a/lib/lp/testing/factory.py
127+++ b/lib/lp/testing/factory.py
128@@ -2219,6 +2219,7 @@ class LaunchpadObjectFactory(ObjectFactory):
129 report=None,
130 artifact_type=None,
131 restricted=False,
132+ date_created=DEFAULT,
133 ):
134 """Create a new RevisionStatusArtifact."""
135 if lfa is None:
136@@ -2230,7 +2231,7 @@ class LaunchpadObjectFactory(ObjectFactory):
137 if artifact_type is None:
138 artifact_type = RevisionStatusArtifactType.LOG
139 return getUtility(IRevisionStatusArtifactSet).new(
140- lfa, report, artifact_type
141+ lfa, report, artifact_type, date_created=date_created
142 )
143
144 def makeBug(

Subscribers

People subscribed via source and target branches

to status/vote changes: