@@ -17,22 +17,21 @@ import XCTest
1717@testable import App
1818
1919import Dependencies
20+ import Fluent
2021import Vapor
2122
2223
2324class CustomCollectionControllerTests : AppTestCase {
2425
2526 func test_query( ) async throws {
2627 // setup
27- let pkg = Package ( id: . id0, url: " 1 " . asGithubUrl. url)
28- try await pkg. save ( on: app. db)
29- try await Repository ( package : pkg, name: " 1 " , owner: " owner " ) . save ( on: app. db)
30- try await Version ( package : pkg, latest: . defaultBranch) . save ( on: app. db)
31- let collection = CustomCollection ( id: . id1, . init( key: " list " ,
32- name: " List " ,
33- url: " https://github.com/foo/bar/list.json " ) )
34- try await collection. save ( on: app. db)
35- try await collection. $packages. attach ( [ pkg] , on: app. db)
28+ try await CustomCollection . save (
29+ on: app. db,
30+ key: " list " ,
31+ name: " List " ,
32+ url: " https://github.com/foo/bar/list.json " ,
33+ packages: [ ( id: . id0, url: " https://github.com/foo/1 " , owner: " foo " , name: " 1 " ) ]
34+ )
3635
3736 // MUT
3837 let page = try await CustomCollectionsController . query ( on: app. db,
@@ -45,4 +44,69 @@ class CustomCollectionControllerTests: AppTestCase {
4544 XCTAssertEqual ( page. hasMoreResults, false )
4645 }
4746
47+ func test_query_pagination( ) async throws {
48+ // setup
49+ let pkgInfo = [ UUID . id0, . id1, . id2, . id3, . id4] . enumerated ( ) . shuffled ( ) . map { ( idx, id) in
50+ ( id, URL ( string: " https://github.com/foo/ \( idx) " ) !, " foo " , " \( idx) " )
51+ }
52+ try await CustomCollection . save (
53+ on: app. db,
54+ key: " list " ,
55+ name: " List " ,
56+ url: " https://github.com/foo/bar/list.json " ,
57+ packages: pkgInfo
58+ )
59+
60+ do { // first page
61+ // MUT
62+ let page = try await CustomCollectionsController . query ( on: app. db,
63+ key: " list " ,
64+ page: 1 ,
65+ pageSize: 2 )
66+ // validate
67+ XCTAssertEqual ( page. results. map ( \. repository. name) , [ " 0 " , " 1 " ] )
68+ XCTAssertEqual ( page. hasMoreResults, true )
69+ }
70+
71+ do { // second page
72+ // MUT
73+ let page = try await CustomCollectionsController . query ( on: app. db,
74+ key: " list " ,
75+ page: 2 ,
76+ pageSize: 2 )
77+ // validate
78+ XCTAssertEqual ( page. results. map ( \. repository. name) , [ " 2 " , " 3 " ] )
79+ XCTAssertEqual ( page. hasMoreResults, true )
80+ }
81+
82+ do { // first page
83+ // MUT
84+ let page = try await CustomCollectionsController . query ( on: app. db,
85+ key: " list " ,
86+ page: 3 ,
87+ pageSize: 2 )
88+ // validate
89+ XCTAssertEqual ( page. results. map ( \. repository. name) , [ " 4 " ] )
90+ XCTAssertEqual ( page. hasMoreResults, false )
91+ }
92+ }
93+
94+ }
95+
96+
97+ private extension CustomCollection {
98+ @discardableResult
99+ static func save( on database: Database , key: String , name: String , url: URL , packages: [ ( id: Package . Id , url: URL , owner: String , name: String ) ] ) async throws -> CustomCollection {
100+ let packages = try await packages. mapAsync {
101+ let pkg = Package ( id: $0. id, url: $0. url)
102+ try await pkg. save ( on: database)
103+ try await Repository ( package : pkg, name: $0. name, owner: $0. owner) . save ( on: database)
104+ try await Version ( package : pkg, latest: . defaultBranch) . save ( on: database)
105+ return pkg
106+ }
107+ let collection = CustomCollection ( id: . id1, . init( key: key, name: name, url: url) )
108+ try await collection. save ( on: database)
109+ try await collection. $packages. attach ( packages, on: database)
110+ return collection
111+ }
48112}
0 commit comments