Skip to content

Commit 14df6d7

Browse files
authored
feat: migrate all XCTest to Swift Testing (#52)
1 parent 4928ba4 commit 14df6d7

File tree

8 files changed

+531
-524
lines changed

8 files changed

+531
-524
lines changed

Tests/CasbinTests/ConfigTests.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import Testing
22
import Casbin
33
import NIO
44

5-
@Suite("Config parsing")
5+
@Suite("Config parsing", .timeLimit(.minutes(1)))
66
struct ConfigTests {
77
@Test("load from file and get/set")
88
func testGet() throws {

Tests/CasbinTests/DefaultModelTests.swift

Lines changed: 210 additions & 211 deletions
Large diffs are not rendered by default.

Tests/CasbinTests/EnforcerTests.swift

Lines changed: 268 additions & 263 deletions
Large diffs are not rendered by default.
Lines changed: 41 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -1,57 +1,53 @@
1-
import XCTest
1+
import Testing
22
import NIO
33
import Casbin
44

5-
6-
final class RbacApiTests: XCTestCase {
7-
var elg = MultiThreadedEventLoopGroup(numberOfThreads: 1)
8-
var pool = NIOThreadPool(numberOfThreads: 1)
9-
deinit {
10-
do {
11-
try pool.syncShutdownGracefully()
12-
try elg.syncShutdownGracefully()
13-
} catch {
14-
15-
}
16-
}
17-
func makeEnforer(_ mfile:String,_ aFile:String? = nil) throws -> Enforcer {
18-
5+
@Suite("RBAC API", .timeLimit(.minutes(1)))
6+
struct RbacApiTests {
7+
private func withEnforcer(_ mfile: String, _ aFile: String? = nil, body: (Enforcer) throws -> Void) throws {
8+
let pool = NIOThreadPool(numberOfThreads: 1)
199
pool.start()
10+
let elg = MultiThreadedEventLoopGroup(numberOfThreads: 1)
11+
defer {
12+
try? elg.syncShutdownGracefully()
13+
try? pool.syncShutdownGracefully()
14+
}
2015
let fileIo = NonBlockingFileIO(threadPool: pool)
21-
let m = try DefaultModel.from(file:TestsfilePath + mfile , fileIo: fileIo, on: elg.next()).wait()
22-
var adapter:Adapter
16+
let m = try DefaultModel.from(file: TestsfilePath + mfile, fileIo: fileIo, on: elg.next()).wait()
17+
let adapter: Adapter
2318
if let aFile = aFile {
24-
adapter = FileAdapter.init(filePath: TestsfilePath + aFile, fileIo: fileIo, eventloop: elg.next())
19+
adapter = FileAdapter(filePath: TestsfilePath + aFile, fileIo: fileIo, eventloop: elg.next())
2520
} else {
26-
adapter = MemoryAdapter.init(on: elg.next())
21+
adapter = MemoryAdapter(on: elg.next())
2722
}
28-
let e = try Enforcer.init(m: m, adapter: adapter)
29-
return e
23+
let e = try Enforcer(m: m, adapter: adapter)
24+
e.enableLog = false
25+
e.logger.logLevel = .warning
26+
try body(e)
3027
}
31-
32-
func testRoleApi() throws {
33-
let e = try makeEnforer("examples/rbac_model.conf", "examples/rbac_policy.csv")
34-
XCTAssertEqual(["data2_admin"], e.getRoles(for: "alice", domain: nil))
35-
XCTAssertEqual([], e.getRoles(for: "bob", domain: nil))
36-
XCTAssertEqual([], e.getRoles(for: "data2_admin", domain: nil))
37-
XCTAssertEqual([], e.getRoles(for: "non_exists", domain: nil))
38-
39-
XCTAssertEqual(false, e.hasRole(for: "alice", role: "data1_admin", domain: nil))
40-
XCTAssertEqual(true, e.hasRole(for: "alice", role: "data2_admin", domain: nil))
41-
_ = try e.addRole(for: "alice", role: "data1_admin", domain: nil).wait()
42-
XCTAssertEqual(["data1_admin", "data2_admin"], e.getRoles(for: "alice", domain: nil).sorted())
43-
XCTAssertEqual([], e.getRoles(for: "bob", domain: nil).sorted())
44-
XCTAssertEqual([], e.getRoles(for: "data2_admin", domain: nil).sorted())
45-
XCTAssertEqual(["read", "write"], e.getAllActions().sorted())
46-
//XCTAssertEqual(["data1", "data2"], e.getAllObjects().sorted())
47-
//XCTAssertEqual(["alice", "bob", "data2_admin"], e.getAllSubjects().sorted())
48-
//XCTAssertEqual(["data1_admin", "data2_admin"], e.getAllRoles().sorted())
28+
29+
@Test("basic role APIs")
30+
func roleApi() throws {
31+
try withEnforcer("examples/rbac_model.conf", "examples/rbac_policy.csv") { e in
32+
#expect(e.getRoles(for: "alice", domain: nil) == ["data2_admin"])
33+
#expect(e.getRoles(for: "bob", domain: nil).isEmpty)
34+
#expect(e.getRoles(for: "data2_admin", domain: nil).isEmpty)
35+
#expect(e.getRoles(for: "non_exists", domain: nil).isEmpty)
36+
37+
#expect(!e.hasRole(for: "alice", role: "data1_admin", domain: nil))
38+
#expect(e.hasRole(for: "alice", role: "data2_admin", domain: nil))
39+
_ = try e.addRole(for: "alice", role: "data1_admin", domain: nil).wait()
40+
#expect(e.getRoles(for: "alice", domain: nil).sorted() == ["data1_admin", "data2_admin"])
41+
#expect(e.getRoles(for: "bob", domain: nil).sorted() == [])
42+
#expect(e.getRoles(for: "data2_admin", domain: nil).sorted() == [])
43+
#expect(e.getAllActions().sorted() == ["read", "write"])
44+
}
4945
}
50-
func testCoreApi_for_RoleApi_with_domain() throws {
51-
let e = try makeEnforer("examples/rbac_with_domains_model.conf", "examples/rbac_with_domains_policy.csv")
52-
XCTAssertEqual(["read", "write"], e.getAllActions().sorted())
53-
//XCTAssertEqual(["data1", "data2"], e.getAllObjects())
54-
//XCTAssertEqual(["admin",], e.getAllSubjects())
55-
//XCTAssertEqual(["admin", ], e.getAllRoles())
46+
47+
@Test("core API with domain")
48+
func coreApiWithDomain() throws {
49+
try withEnforcer("examples/rbac_with_domains_model.conf", "examples/rbac_with_domains_policy.csv") { e in
50+
#expect(e.getAllActions().sorted() == ["read", "write"])
51+
}
5652
}
5753
}

Tests/CasbinTests/RoleTests.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import Testing
22
import Casbin
3-
@Suite("Role Manager Tests")
3+
@Suite("Role Manager Tests", .timeLimit(.minutes(1)))
44
struct RoleTests {
55
struct Params {
66
let name1: String
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
import NIO
2+
3+
// Shared helpers for test file paths and small utilities
4+
public let TestsfilePath = #file.components(separatedBy: "TestSupport.swift")[0]
5+
6+
@inline(__always)
7+
func tryBool(_ body: () throws -> Bool) -> Bool { (try? body()) ?? false }
8+

Tests/CasbinTests/UtilsTests/KeyMatchTests.swift

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import Testing
22
import Casbin
33

4-
@Suite("Key/Glob/IP match utilities")
4+
@Suite("Key/Glob/IP match utilities", .timeLimit(.minutes(1)))
55
struct KeyMatchTests {
66
@Test("keyMatch")
77
func testKeyMatch() {
@@ -83,4 +83,3 @@ struct KeyMatchTests {
8383
#expect(!Util.globMatch("/prefix/subprefix/foobar", "*/foo/*"))
8484
}
8585
}
86-

Tests/CasbinTests/UtilsTests/UtilsTests.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import Testing
22
import Casbin
33

4-
@Suite("Utilities: CSV + assertion escaping")
4+
@Suite("Utilities: CSV + assertion escaping", .timeLimit(.minutes(1)))
55
struct UtilsTests {
66
@Test("escapeAssertion replaces dots with underscores")
77
func testEscapeAssertion() {

0 commit comments

Comments
 (0)