@@ -32,40 +32,21 @@ class BuildTriggerTests: AppTestCase {
3232 }
3333
3434 func test_fetchBuildCandidates_missingBuilds( ) async throws {
35- // setup
36- let pkgIdComplete = UUID ( )
37- let pkgIdIncomplete1 = UUID ( )
38- let pkgIdIncomplete2 = UUID ( )
39- do { // save package with all builds
40- let p = Package ( id: pkgIdComplete, url: pkgIdComplete. uuidString. url)
41- try await p. save ( on: app. db)
42- let v = try Version ( package : p,
43- latest: . defaultBranch,
44- reference: . branch( " main " ) )
45- try await v. save ( on: app. db)
46- for pair in BuildPair . all {
47- try await Build ( id: UUID ( ) ,
48- version: v,
49- platform: pair. platform,
50- status: . ok,
51- swiftVersion: pair. swiftVersion)
52- . save ( on: app. db)
53- }
54- }
55- // save two packages with partially completed builds
56- for id in [ pkgIdIncomplete1, pkgIdIncomplete2] {
57- let p = Package ( id: id, url: id. uuidString. url)
58- try await p. save ( on: app. db)
59- for kind in [ Version . Kind. defaultBranch, . release] {
35+ try await withDependencies {
36+ $0. environment. buildTriggerAllowList = { [ ] }
37+ } operation: {
38+ // setup
39+ let pkgIdComplete = UUID ( )
40+ let pkgIdIncomplete1 = UUID ( )
41+ let pkgIdIncomplete2 = UUID ( )
42+ do { // save package with all builds
43+ let p = Package ( id: pkgIdComplete, url: pkgIdComplete. uuidString. url)
44+ try await p. save ( on: app. db)
6045 let v = try Version ( package : p,
61- latest: kind,
62- reference: kind == . release
63- ? . tag( 1 , 2 , 3 )
64- : . branch( " main " ) )
46+ latest: . defaultBranch,
47+ reference: . branch( " main " ) )
6548 try await v. save ( on: app. db)
66- for pair in BuildPair . all
67- . dropFirst ( ) // skip one platform to create a build gap
68- {
49+ for pair in BuildPair . all {
6950 try await Build ( id: UUID ( ) ,
7051 version: v,
7152 platform: pair. platform,
@@ -74,79 +55,110 @@ class BuildTriggerTests: AppTestCase {
7455 . save ( on: app. db)
7556 }
7657 }
77- }
58+ // save two packages with partially completed builds
59+ for id in [ pkgIdIncomplete1, pkgIdIncomplete2] {
60+ let p = Package ( id: id, url: id. uuidString. url)
61+ try await p. save ( on: app. db)
62+ for kind in [ Version . Kind. defaultBranch, . release] {
63+ let v = try Version ( package : p,
64+ latest: kind,
65+ reference: kind == . release
66+ ? . tag( 1 , 2 , 3 )
67+ : . branch( " main " ) )
68+ try await v. save ( on: app. db)
69+ for pair in BuildPair . all
70+ . dropFirst ( ) // skip one platform to create a build gap
71+ {
72+ try await Build ( id: UUID ( ) ,
73+ version: v,
74+ platform: pair. platform,
75+ status: . ok,
76+ swiftVersion: pair. swiftVersion)
77+ . save ( on: app. db)
78+ }
79+ }
80+ }
7881
79- // MUT
80- let ids = try await fetchBuildCandidates ( app. db)
82+ // MUT
83+ let ids = try await fetchBuildCandidates ( app. db)
8184
82- // validate
83- XCTAssertEqual ( ids, [ pkgIdIncomplete1, pkgIdIncomplete2] )
85+ // validate
86+ XCTAssertEqual ( ids, [ pkgIdIncomplete1, pkgIdIncomplete2] )
87+ }
8488 }
8589
8690 func test_fetchBuildCandidates_noBuilds( ) async throws {
8791 // Test finding build candidate without any builds (essentially
8892 // testing the `LEFT` in `LEFT JOIN builds`)
89- // setup
90- // save package without any builds
91- let pkgId = UUID ( )
92- let p = Package ( id: pkgId, url: pkgId. uuidString. url)
93- try await p. save ( on: app. db)
94- for kind in [ Version . Kind. defaultBranch, . release] {
95- let v = try Version ( package : p,
96- latest: kind,
97- reference: kind == . release
98- ? . tag( 1 , 2 , 3 )
99- : . branch( " main " ) )
100- try await v. save ( on: app. db)
101- }
93+ try await withDependencies {
94+ $0. environment. buildTriggerAllowList = { [ ] }
95+ } operation: {
96+ // setup
97+ // save package without any builds
98+ let pkgId = UUID ( )
99+ let p = Package ( id: pkgId, url: pkgId. uuidString. url)
100+ try await p. save ( on: app. db)
101+ for kind in [ Version . Kind. defaultBranch, . release] {
102+ let v = try Version ( package : p,
103+ latest: kind,
104+ reference: kind == . release
105+ ? . tag( 1 , 2 , 3 )
106+ : . branch( " main " ) )
107+ try await v. save ( on: app. db)
108+ }
102109
103- // MUT
104- let ids = try await fetchBuildCandidates ( app. db)
110+ // MUT
111+ let ids = try await fetchBuildCandidates ( app. db)
105112
106- // validate
107- XCTAssertEqual ( ids, [ pkgId] )
113+ // validate
114+ XCTAssertEqual ( ids, [ pkgId] )
115+ }
108116 }
109117
110118 func test_fetchBuildCandidates_exceptLatestSwiftVersion( ) async throws {
111- // setup
112- do { // save package with just latest Swift version builds missing
113- let p = Package ( id: . id1, url: " 1 " )
114- try await p. save ( on: app. db)
115- let v = try Version ( id: . init( ) ,
116- package : p,
117- latest: . release,
118- reference: . tag( 1 , 2 , 3 ) )
119- try await v. save ( on: app. db)
120- for platform in Build . Platform. allActive {
121- for swiftVersion in SwiftVersion
122- . allActive
123- // skip latest Swift version build
124- . filter ( { $0 != . latest } ) {
125- try await Build ( id: . init( ) ,
119+ try await withDependencies {
120+ $0. environment. buildTriggerAllowList = { [ ] }
121+ } operation: {
122+ // setup
123+ do { // save package with just latest Swift version builds missing
124+ let p = Package ( id: . id1, url: " 1 " )
125+ try await p. save ( on: app. db)
126+ let v = try Version ( id: . init( ) ,
127+ package : p,
128+ latest: . release,
129+ reference: . tag( 1 , 2 , 3 ) )
130+ try await v. save ( on: app. db)
131+ for platform in Build . Platform. allActive {
132+ for swiftVersion in SwiftVersion
133+ . allActive
134+ // skip latest Swift version build
135+ . filter ( { $0 != . latest } ) {
136+ try await Build ( id: . init( ) ,
126137 version: v,
127138 platform: platform,
128139 status: . ok,
129140 swiftVersion: swiftVersion)
130141 . save ( on: app. db)
142+ }
131143 }
132144 }
133- }
134- do { // save package without any builds
135- let p = Package ( id: . id2, url: " 2 " )
136- try await p. save ( on: app. db)
137- let v = try Version ( id: . id3,
138- package : p,
139- latest: . release,
140- reference: . tag( 1 , 2 , 3 ) )
141- try await v. save ( on: app. db)
142- }
145+ do { // save package without any builds
146+ let p = Package ( id: . id2, url: " 2 " )
147+ try await p. save ( on: app. db)
148+ let v = try Version ( id: . id3,
149+ package : p,
150+ latest: . release,
151+ reference: . tag( 1 , 2 , 3 ) )
152+ try await v. save ( on: app. db)
153+ }
143154
144- // MUT
145- let ids = try await fetchBuildCandidates ( app. db, withLatestSwiftVersion: false )
155+ // MUT
156+ let ids = try await fetchBuildCandidates ( app. db, withLatestSwiftVersion: false )
146157
147- // validate
148- // Only package with missing non-latest Swift version builds (.id2) must be selected
149- XCTAssertEqual ( ids, [ . id2] )
158+ // validate
159+ // Only package with missing non-latest Swift version builds (.id2) must be selected
160+ XCTAssertEqual ( ids, [ . id2] )
161+ }
150162 }
151163
152164 func test_fetchBuildCandidates_priorityIDs( ) async throws {
@@ -395,6 +407,7 @@ class BuildTriggerTests: AppTestCase {
395407 $0. environment. awsDocsBucket = { " awsDocsBucket " }
396408 $0. environment. builderToken = { " builder token " }
397409 $0. environment. buildTimeout = { 10 }
410+ $0. environment. buildTriggerAllowList = { [ ] }
398411 } operation: {
399412 // Explicitly test the full range of all currently triggered platforms and swift versions
400413 // setup
@@ -557,6 +570,9 @@ class BuildTriggerTests: AppTestCase {
557570 $0. environment. awsDocsBucket = { " awsDocsBucket " }
558571 $0. environment. builderToken = { " builder token " }
559572 $0. environment. buildTimeout = { 10 }
573+ $0. environment. buildTriggerAllowList = { [ ] }
574+ $0. environment. buildTriggerDownscaling = { 1 }
575+ $0. environment. random = { @Sendable _ in 0 }
560576 } operation: {
561577 // Ensure we respect the pipeline limit when triggering builds
562578 // setup
@@ -670,6 +686,10 @@ class BuildTriggerTests: AppTestCase {
670686 $0. environment. awsDocsBucket = { " awsDocsBucket " }
671687 $0. environment. builderToken = { " builder token " }
672688 $0. environment. buildTimeout = { 10 }
689+ $0. environment. buildTriggerAllowList = { [ ] }
690+ $0. environment. buildTriggerDownscaling = { 1 }
691+ $0. environment. buildTriggerLatestSwiftVersionDownscaling = { 1 }
692+ $0. environment. random = { @Sendable _ in 0 }
673693 } operation: {
674694 // Ensure we respect the pipeline limit when triggering builds for multiple package ids
675695 // setup
@@ -720,6 +740,9 @@ class BuildTriggerTests: AppTestCase {
720740 $0. environment. allowBuildTriggers = { true }
721741 $0. environment. awsDocsBucket = { " awsDocsBucket " }
722742 $0. environment. builderToken = { " builder token " }
743+ $0. environment. buildTriggerAllowList = { [ ] }
744+ $0. environment. buildTriggerDownscaling = { 1 }
745+ $0. environment. random = { @Sendable _ in 0 }
723746 } operation: {
724747 // Ensure we trim builds as part of triggering
725748 // setup
@@ -757,6 +780,9 @@ class BuildTriggerTests: AppTestCase {
757780 $0. environment. awsDocsBucket = { " awsDocsBucket " }
758781 $0. environment. builderToken = { " builder token " }
759782 $0. environment. buildTimeout = { 10 }
783+ $0. environment. buildTriggerAllowList = { [ ] }
784+ $0. environment. buildTriggerDownscaling = { 1 }
785+ $0. environment. random = { @Sendable _ in 0 }
760786 } operation: {
761787 // Ensure we trim builds as part of triggering
762788 // setup
@@ -882,6 +908,9 @@ class BuildTriggerTests: AppTestCase {
882908 $0. environment. awsDocsBucket = { " awsDocsBucket " }
883909 $0. environment. builderToken = { " builder token " }
884910 $0. environment. buildTimeout = { 10 }
911+ $0. environment. buildTriggerAllowList = { [ ] }
912+ $0. environment. buildTriggerDownscaling = { 1 }
913+ $0. environment. random = { @Sendable _ in 0 }
885914 } operation: {
886915 // Ensure don't trigger if the override is off
887916 // setup
@@ -957,6 +986,7 @@ class BuildTriggerTests: AppTestCase {
957986 $0. environment. awsDocsBucket = { " awsDocsBucket " }
958987 $0. environment. builderToken = { " builder token " }
959988 $0. environment. buildTimeout = { 10 }
989+ $0. environment. buildTriggerAllowList = { [ ] }
960990 $0. environment. buildTriggerDownscaling = { 0.05 } // 5% downscaling rate
961991 } operation: {
962992 // Test build trigger downscaling behaviour
0 commit comments