Skip to content

Commit 1cd7211

Browse files
Merge pull request #3696 from SwiftPackageIndex/issue-3655-swift-testing-part-17
Issue 3655 swift testing part 17
2 parents 2709184 + 904e9be commit 1cd7211

File tree

5 files changed

+149
-135
lines changed

5 files changed

+149
-135
lines changed

Package.swift

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ let package = Package(
3838
.package(url: "https://github.com/swiftlang/swift-package-manager.git", branch: "release/5.10"),
3939
.package(url: "https://github.com/dankinsoid/VaporToOpenAPI.git", from: "4.4.4"),
4040
.package(url: "https://github.com/pointfreeco/swift-custom-dump.git", from: "1.0.0"),
41-
.package(url: "https://github.com/pointfreeco/swift-dependencies", from: "1.5.2"),
41+
.package(url: "https://github.com/pointfreeco/swift-dependencies", from: "1.8.0"),
4242
.package(url: "https://github.com/pointfreeco/swift-parsing.git", from: "0.12.0"),
4343
.package(url: "https://github.com/pointfreeco/swift-snapshot-testing.git", from: "1.11.1"),
4444
.package(url: "https://github.com/scinfu/SwiftSoup.git", from: "2.3.2"),
@@ -94,6 +94,7 @@ let package = Package(
9494
swiftSettings: swiftSettings),
9595
.testTarget(name: "AppTests",
9696
dependencies: [
97+
.product(name: "DependenciesTestSupport", package: "swift-dependencies"),
9798
.product(name: "SnapshotTesting", package: "swift-snapshot-testing"),
9899
.product(name: "InlineSnapshotTesting", package: "swift-snapshot-testing"),
99100
.product(name: "XCTVapor", package: "vapor"),

Tests/AppTests/KeywordControllerTests.swift

Lines changed: 100 additions & 93 deletions
Original file line numberDiff line numberDiff line change
@@ -12,124 +12,131 @@
1212
// See the License for the specific language governing permissions and
1313
// limitations under the License.
1414

15-
import XCTest
16-
1715
@testable import App
1816

1917
import Dependencies
18+
import Testing
2019
import Vapor
2120

2221

23-
class KeywordControllerTests: AppTestCase {
24-
25-
func test_query() async throws {
26-
// setup
27-
do {
28-
let p = try await savePackage(on: app.db, "0")
29-
try await Repository(package: p,
30-
keywords: ["bar"],
31-
name: "0",
32-
owner: "owner")
33-
.save(on: app.db)
34-
try await Version(package: p, latest: .defaultBranch).save(on: app.db)
35-
}
36-
do {
37-
let p = try await savePackage(on: app.db, "1")
38-
try await Repository(package: p,
39-
keywords: ["foo"],
40-
name: "1",
41-
owner: "owner")
42-
.save(on: app.db)
43-
try await Version(package: p, latest: .defaultBranch).save(on: app.db)
44-
}
45-
do {
46-
let p = try await savePackage(on: app.db, "2")
47-
try await Repository(package: p,
48-
name: "2",
49-
owner: "owner")
50-
.save(on: app.db)
51-
try await Version(package: p, latest: .defaultBranch).save(on: app.db)
52-
}
53-
// MUT
54-
let page = try await KeywordController.query(on: app.db,
55-
keyword: "foo",
56-
page: 1,
57-
pageSize: 10)
58-
59-
// validation
60-
XCTAssertEqual(page.results.map(\.repository.name), ["1"])
61-
XCTAssertEqual(page.hasMoreResults, false)
62-
}
22+
@Suite struct KeywordControllerTests {
6323

64-
func test_query_pagination() async throws {
65-
// setup
66-
for idx in (0..<9).shuffled() {
67-
let p = Package(url: "\(idx)".url, score: 10 - idx)
68-
try await p.save(on: app.db)
69-
try await Repository(package: p,
70-
keywords: ["foo"],
71-
name: "\(idx)",
72-
owner: "owner").save(on: app.db)
73-
try await Version(package: p, latest: .defaultBranch).save(on: app.db)
74-
}
75-
do { // first page
76-
// MUT
24+
@Test func query() async throws {
25+
try await withApp { app in
26+
// setup
27+
do {
28+
let p = try await savePackage(on: app.db, "0")
29+
try await Repository(package: p,
30+
keywords: ["bar"],
31+
name: "0",
32+
owner: "owner")
33+
.save(on: app.db)
34+
try await Version(package: p, latest: .defaultBranch).save(on: app.db)
35+
}
36+
do {
37+
let p = try await savePackage(on: app.db, "1")
38+
try await Repository(package: p,
39+
keywords: ["foo"],
40+
name: "1",
41+
owner: "owner")
42+
.save(on: app.db)
43+
try await Version(package: p, latest: .defaultBranch).save(on: app.db)
44+
}
45+
do {
46+
let p = try await savePackage(on: app.db, "2")
47+
try await Repository(package: p,
48+
name: "2",
49+
owner: "owner")
50+
.save(on: app.db)
51+
try await Version(package: p, latest: .defaultBranch).save(on: app.db)
52+
}
53+
// MUT
7754
let page = try await KeywordController.query(on: app.db,
7855
keyword: "foo",
7956
page: 1,
80-
pageSize: 3)
81-
// validate
82-
XCTAssertEqual(page.results.map(\.repository.name), ["0", "1", "2"])
83-
XCTAssertEqual(page.hasMoreResults, true)
84-
}
85-
do { // second page
86-
// MUT
87-
let page = try await KeywordController.query(on: app.db,
88-
keyword: "foo",
89-
page: 2,
90-
pageSize: 3)
91-
// validate
92-
XCTAssertEqual(page.results.map(\.repository.name), ["3", "4", "5"])
93-
XCTAssertEqual(page.hasMoreResults, true)
94-
}
95-
do { // last page
96-
// MUT
97-
let page = try await KeywordController.query(on: app.db,
98-
keyword: "foo",
99-
page: 3,
100-
pageSize: 3)
101-
// validate
102-
XCTAssertEqual(page.results.map(\.repository.name), ["6", "7", "8"])
103-
XCTAssertEqual(page.hasMoreResults, false)
57+
pageSize: 10)
58+
59+
// validation
60+
#expect(page.results.map(\.repository.name) == ["1"])
61+
#expect(page.hasMoreResults == false)
10462
}
10563
}
10664

107-
func test_show_keyword() async throws {
108-
try await withDependencies {
109-
$0.environment.dbId = { nil }
110-
} operation: {
111-
do {
112-
let p = try await savePackage(on: app.db, "1")
65+
@Test func query_pagination() async throws {
66+
try await withApp { app in
67+
// setup
68+
for idx in (0..<9).shuffled() {
69+
let p = Package(url: "\(idx)".url, score: 10 - idx)
70+
try await p.save(on: app.db)
11371
try await Repository(package: p,
11472
keywords: ["foo"],
115-
name: "1",
73+
name: "\(idx)",
11674
owner: "owner").save(on: app.db)
11775
try await Version(package: p, latest: .defaultBranch).save(on: app.db)
11876
}
119-
// MUT
120-
try await app.test(.GET, "/keywords/foo") { req async in
77+
do { // first page
78+
// MUT
79+
let page = try await KeywordController.query(on: app.db,
80+
keyword: "foo",
81+
page: 1,
82+
pageSize: 3)
12183
// validate
122-
XCTAssertEqual(req.status, .ok)
84+
#expect(page.results.map(\.repository.name) == ["0", "1", "2"])
85+
#expect(page.hasMoreResults == true)
86+
}
87+
do { // second page
88+
// MUT
89+
let page = try await KeywordController.query(on: app.db,
90+
keyword: "foo",
91+
page: 2,
92+
pageSize: 3)
93+
// validate
94+
#expect(page.results.map(\.repository.name) == ["3", "4", "5"])
95+
#expect(page.hasMoreResults == true)
96+
}
97+
do { // last page
98+
// MUT
99+
let page = try await KeywordController.query(on: app.db,
100+
keyword: "foo",
101+
page: 3,
102+
pageSize: 3)
103+
// validate
104+
#expect(page.results.map(\.repository.name) == ["6", "7", "8"])
105+
#expect(page.hasMoreResults == false)
106+
}
107+
}
108+
}
109+
110+
@Test func show_keyword() async throws {
111+
try await withDependencies {
112+
$0.environment.dbId = { nil }
113+
} operation: {
114+
try await withApp { app in
115+
do {
116+
let p = try await savePackage(on: app.db, "1")
117+
try await Repository(package: p,
118+
keywords: ["foo"],
119+
name: "1",
120+
owner: "owner").save(on: app.db)
121+
try await Version(package: p, latest: .defaultBranch).save(on: app.db)
122+
}
123+
// MUT
124+
try await app.test(.GET, "/keywords/foo") { req async in
125+
// validate
126+
#expect(req.status == .ok)
127+
}
123128
}
124129
}
125130
}
126131

127-
func test_not_found() throws {
128-
try withDependencies {
132+
@Test func not_found() async throws {
133+
try await withDependencies {
129134
$0.environment.dbId = { nil }
130135
} operation: {
131-
try app.test(.GET, "/keywords/baz") {
132-
XCTAssertEqual($0.status, .notFound)
136+
try await withApp { app in
137+
try await app.test(.GET, "/keywords/baz") { res async in
138+
#expect(res.status == .notFound)
139+
}
133140
}
134141
}
135142
}

Tests/AppTests/LicenseTests.swift

Lines changed: 25 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -14,41 +14,42 @@
1414

1515
@testable import App
1616

17-
import XCTVapor
17+
import Testing
1818

19-
class LicenseTests: XCTestCase {
2019

21-
func test_init_from_dto() throws {
22-
XCTAssertEqual(License(from: Github.Metadata.LicenseInfo(key: "mit")), .mit)
23-
XCTAssertEqual(License(from: Github.Metadata.LicenseInfo(key: "agpl-3.0")), .agpl_3_0)
24-
XCTAssertEqual(License(from: Github.Metadata.LicenseInfo(key: "other")), .other)
25-
XCTAssertEqual(License(from: .none), .none)
20+
@Suite struct LicenseTests {
21+
22+
@Test func init_from_dto() throws {
23+
#expect(License(from: Github.Metadata.LicenseInfo(key: "mit")) == .mit)
24+
#expect(License(from: Github.Metadata.LicenseInfo(key: "agpl-3.0")) == .agpl_3_0)
25+
#expect(License(from: Github.Metadata.LicenseInfo(key: "other")) == .other)
26+
#expect(License(from: .none) == .none)
2627
}
2728

28-
func test_init_from_dto_unknown() throws {
29+
@Test func init_from_dto_unknown() throws {
2930
// ensure unknown licenses are mapped to `.other`
30-
XCTAssertEqual(License(from: Github.Metadata.LicenseInfo(key: "non-existing license")), .other)
31+
#expect(License(from: Github.Metadata.LicenseInfo(key: "non-existing license")) == .other)
3132
}
3233

33-
func test_fullName() throws {
34-
XCTAssertEqual(License.mit.fullName, "MIT License")
35-
XCTAssertEqual(License.agpl_3_0.fullName, "GNU Affero General Public License v3.0")
36-
XCTAssertEqual(License.other.fullName, "Unknown or Unrecognised License")
37-
XCTAssertEqual(License.none.fullName, "No License")
34+
@Test func fullName() throws {
35+
#expect(License.mit.fullName == "MIT License")
36+
#expect(License.agpl_3_0.fullName == "GNU Affero General Public License v3.0")
37+
#expect(License.other.fullName == "Unknown or Unrecognised License")
38+
#expect(License.none.fullName == "No License")
3839
}
3940

40-
func test_shortName() throws {
41-
XCTAssertEqual(License.mit.shortName, "MIT")
42-
XCTAssertEqual(License.agpl_3_0.shortName, "AGPL 3.0")
43-
XCTAssertEqual(License.other.shortName, "Unknown license")
44-
XCTAssertEqual(License.none.shortName, "No license")
41+
@Test func shortName() throws {
42+
#expect(License.mit.shortName == "MIT")
43+
#expect(License.agpl_3_0.shortName == "AGPL 3.0")
44+
#expect(License.other.shortName == "Unknown license")
45+
#expect(License.none.shortName == "No license")
4546
}
4647

47-
func test_isCompatibleWithAppStore() throws {
48-
XCTAssertEqual(License.mit.licenseKind, .compatibleWithAppStore)
49-
XCTAssertEqual(License.agpl_3_0.licenseKind, .incompatibleWithAppStore)
50-
XCTAssertEqual(License.other.licenseKind, .other)
51-
XCTAssertEqual(License.none.licenseKind, .none)
48+
@Test func isCompatibleWithAppStore() throws {
49+
#expect(License.mit.licenseKind == .compatibleWithAppStore)
50+
#expect(License.agpl_3_0.licenseKind == .incompatibleWithAppStore)
51+
#expect(License.other.licenseKind == .other)
52+
#expect(License.none.licenseKind == .none)
5253
}
5354

5455
}

Tests/AppTests/LiveTests.swift

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -12,18 +12,21 @@
1212
// See the License for the specific language governing permissions and
1313
// limitations under the License.
1414

15+
import Foundation
16+
1517
@testable import App
1618

1719
import Dependencies
18-
import XCTVapor
19-
20+
import Testing
21+
import Vapor
2022

21-
class LiveTests: XCTestCase {
2223

23-
func test_Mastodon_post() async throws {
24-
// Only run this test manually to confirm posting works
25-
try XCTSkipIf(true)
24+
@Suite struct LiveTests {
2625

26+
@Test(
27+
.disabled("Only run this test manually to confirm posting works")
28+
)
29+
func Mastodon_post() async throws {
2730
try await withDependencies {
2831
$0.environment.mastodonCredentials = { .dev }
2932
$0.httpClient = .liveValue

Tests/AppTests/MaintainerInfoIndexModelTests.swift

Lines changed: 13 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -15,48 +15,50 @@
1515
@testable import App
1616

1717
import Dependencies
18+
import DependenciesTestSupport
1819
import SnapshotTesting
19-
import XCTVapor
20+
import Testing
2021

2122

22-
class MaintainerInfoIndexModelTests: SnapshotTestCase {
23+
@Suite(.dependency(\.date.now, .t0))
24+
struct MaintainerInfoIndexModelTests {
2325

24-
func test_badgeURL() throws {
26+
@Test func badgeURL() throws {
2527
withDependencies {
2628
$0.environment.siteURL = { "https://spi.com" }
2729
} operation: {
2830
let model = MaintainerInfoIndex.Model.mock
2931

30-
XCTAssertEqual(model.badgeURL(for: .swiftVersions), "https://img.shields.io/endpoint?url=https%3A%2F%2Fspi.com%2Fapi%2Fpackages%2Fexample%2Fpackage%2Fbadge%3Ftype%3Dswift-versions")
31-
XCTAssertEqual(model.badgeURL(for: .platforms), "https://img.shields.io/endpoint?url=https%3A%2F%2Fspi.com%2Fapi%2Fpackages%2Fexample%2Fpackage%2Fbadge%3Ftype%3Dplatforms")
32+
#expect(model.badgeURL(for: .swiftVersions) == "https://img.shields.io/endpoint?url=https%3A%2F%2Fspi.com%2Fapi%2Fpackages%2Fexample%2Fpackage%2Fbadge%3Ftype%3Dswift-versions")
33+
#expect(model.badgeURL(for: .platforms) == "https://img.shields.io/endpoint?url=https%3A%2F%2Fspi.com%2Fapi%2Fpackages%2Fexample%2Fpackage%2Fbadge%3Ftype%3Dplatforms")
3234
}
3335
}
3436

35-
func test_badgeMarkdown() throws {
37+
@Test func badgeMarkdown() throws {
3638
// Test badge markdown structure
3739
withDependencies {
3840
$0.environment.siteURL = { "https://spi.com" }
3941
} operation: {
4042
let model = MaintainerInfoIndex.Model.mock
41-
43+
4244
let badgeURL = model.badgeURL(for: .swiftVersions)
43-
XCTAssertEqual(model.badgeMarkdown(for: .swiftVersions), "[![](\(badgeURL))](https://spi.com/example/package)")
45+
#expect(model.badgeMarkdown(for: .swiftVersions) == "[![](\(badgeURL))](https://spi.com/example/package)")
4446
}
4547
}
4648

47-
func test_scoreCategories_dependencies() throws {
49+
@Test func scoreCategories_dependencies() throws {
4850
// setup
4951
var model = MaintainerInfoIndex.Model.mock
5052

5153
do {
5254
model.scoreDetails?.numberOfDependencies = 0
5355
let categories = model.scoreCategories
54-
XCTAssertEqual(categories["Dependencies"]?.description, "Has no dependencies.")
56+
#expect(categories["Dependencies"]?.description == "Has no dependencies.")
5557
}
5658
do {
5759
model.scoreDetails?.numberOfDependencies = nil
5860
let categories = model.scoreCategories
59-
XCTAssertEqual(categories["Dependencies"]?.description, "No dependency information available.")
61+
#expect(categories["Dependencies"]?.description == "No dependency information available.")
6062
}
6163
}
6264

0 commit comments

Comments
 (0)