Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion Tests/CasbinTests/ConfigTests.swift
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ import Testing
import Casbin
import NIO

@Suite("Config parsing")
@Suite("Config parsing", .timeLimit(.minutes(1)))
struct ConfigTests {
@Test("load from file and get/set")
func testGet() throws {
Expand Down
421 changes: 210 additions & 211 deletions Tests/CasbinTests/DefaultModelTests.swift

Large diffs are not rendered by default.

531 changes: 268 additions & 263 deletions Tests/CasbinTests/EnforcerTests.swift

Large diffs are not rendered by default.

86 changes: 41 additions & 45 deletions Tests/CasbinTests/RbacApiTests.swift
Original file line number Diff line number Diff line change
@@ -1,57 +1,53 @@
import XCTest
import Testing
import NIO
import Casbin


final class RbacApiTests: XCTestCase {
var elg = MultiThreadedEventLoopGroup(numberOfThreads: 1)
var pool = NIOThreadPool(numberOfThreads: 1)
deinit {
do {
try pool.syncShutdownGracefully()
try elg.syncShutdownGracefully()
} catch {

}
}
func makeEnforer(_ mfile:String,_ aFile:String? = nil) throws -> Enforcer {

@Suite("RBAC API", .timeLimit(.minutes(1)))
struct RbacApiTests {
private func withEnforcer(_ mfile: String, _ aFile: String? = nil, body: (Enforcer) throws -> Void) throws {
let pool = NIOThreadPool(numberOfThreads: 1)
pool.start()
let elg = MultiThreadedEventLoopGroup(numberOfThreads: 1)
defer {
try? elg.syncShutdownGracefully()
try? pool.syncShutdownGracefully()
}
let fileIo = NonBlockingFileIO(threadPool: pool)
let m = try DefaultModel.from(file:TestsfilePath + mfile , fileIo: fileIo, on: elg.next()).wait()
var adapter:Adapter
let m = try DefaultModel.from(file: TestsfilePath + mfile, fileIo: fileIo, on: elg.next()).wait()
let adapter: Adapter
if let aFile = aFile {
adapter = FileAdapter.init(filePath: TestsfilePath + aFile, fileIo: fileIo, eventloop: elg.next())
adapter = FileAdapter(filePath: TestsfilePath + aFile, fileIo: fileIo, eventloop: elg.next())
} else {
adapter = MemoryAdapter.init(on: elg.next())
adapter = MemoryAdapter(on: elg.next())
}
let e = try Enforcer.init(m: m, adapter: adapter)
return e
let e = try Enforcer(m: m, adapter: adapter)
e.enableLog = false
e.logger.logLevel = .warning
try body(e)
}

func testRoleApi() throws {
let e = try makeEnforer("examples/rbac_model.conf", "examples/rbac_policy.csv")
XCTAssertEqual(["data2_admin"], e.getRoles(for: "alice", domain: nil))
XCTAssertEqual([], e.getRoles(for: "bob", domain: nil))
XCTAssertEqual([], e.getRoles(for: "data2_admin", domain: nil))
XCTAssertEqual([], e.getRoles(for: "non_exists", domain: nil))

XCTAssertEqual(false, e.hasRole(for: "alice", role: "data1_admin", domain: nil))
XCTAssertEqual(true, e.hasRole(for: "alice", role: "data2_admin", domain: nil))
_ = try e.addRole(for: "alice", role: "data1_admin", domain: nil).wait()
XCTAssertEqual(["data1_admin", "data2_admin"], e.getRoles(for: "alice", domain: nil).sorted())
XCTAssertEqual([], e.getRoles(for: "bob", domain: nil).sorted())
XCTAssertEqual([], e.getRoles(for: "data2_admin", domain: nil).sorted())
XCTAssertEqual(["read", "write"], e.getAllActions().sorted())
//XCTAssertEqual(["data1", "data2"], e.getAllObjects().sorted())
//XCTAssertEqual(["alice", "bob", "data2_admin"], e.getAllSubjects().sorted())
//XCTAssertEqual(["data1_admin", "data2_admin"], e.getAllRoles().sorted())

@Test("basic role APIs")
func roleApi() throws {
try withEnforcer("examples/rbac_model.conf", "examples/rbac_policy.csv") { e in
#expect(e.getRoles(for: "alice", domain: nil) == ["data2_admin"])
#expect(e.getRoles(for: "bob", domain: nil).isEmpty)
#expect(e.getRoles(for: "data2_admin", domain: nil).isEmpty)
#expect(e.getRoles(for: "non_exists", domain: nil).isEmpty)

#expect(!e.hasRole(for: "alice", role: "data1_admin", domain: nil))
#expect(e.hasRole(for: "alice", role: "data2_admin", domain: nil))
_ = try e.addRole(for: "alice", role: "data1_admin", domain: nil).wait()
#expect(e.getRoles(for: "alice", domain: nil).sorted() == ["data1_admin", "data2_admin"])
#expect(e.getRoles(for: "bob", domain: nil).sorted() == [])
#expect(e.getRoles(for: "data2_admin", domain: nil).sorted() == [])
#expect(e.getAllActions().sorted() == ["read", "write"])
}
}
func testCoreApi_for_RoleApi_with_domain() throws {
let e = try makeEnforer("examples/rbac_with_domains_model.conf", "examples/rbac_with_domains_policy.csv")
XCTAssertEqual(["read", "write"], e.getAllActions().sorted())
//XCTAssertEqual(["data1", "data2"], e.getAllObjects())
//XCTAssertEqual(["admin",], e.getAllSubjects())
//XCTAssertEqual(["admin", ], e.getAllRoles())

@Test("core API with domain")
func coreApiWithDomain() throws {
try withEnforcer("examples/rbac_with_domains_model.conf", "examples/rbac_with_domains_policy.csv") { e in
#expect(e.getAllActions().sorted() == ["read", "write"])
}
}
}
2 changes: 1 addition & 1 deletion Tests/CasbinTests/RoleTests.swift
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import Testing
import Casbin
@Suite("Role Manager Tests")
@Suite("Role Manager Tests", .timeLimit(.minutes(1)))
struct RoleTests {
struct Params {
let name1: String
Expand Down
8 changes: 8 additions & 0 deletions Tests/CasbinTests/TestSupport.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
import NIO

// Shared helpers for test file paths and small utilities
public let TestsfilePath = #file.components(separatedBy: "TestSupport.swift")[0]

@inline(__always)
func tryBool(_ body: () throws -> Bool) -> Bool { (try? body()) ?? false }

3 changes: 1 addition & 2 deletions Tests/CasbinTests/UtilsTests/KeyMatchTests.swift
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import Testing
import Casbin

@Suite("Key/Glob/IP match utilities")
@Suite("Key/Glob/IP match utilities", .timeLimit(.minutes(1)))
struct KeyMatchTests {
@Test("keyMatch")
func testKeyMatch() {
Expand Down Expand Up @@ -83,4 +83,3 @@ struct KeyMatchTests {
#expect(!Util.globMatch("/prefix/subprefix/foobar", "*/foo/*"))
}
}

2 changes: 1 addition & 1 deletion Tests/CasbinTests/UtilsTests/UtilsTests.swift
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import Testing
import Casbin

@Suite("Utilities: CSV + assertion escaping")
@Suite("Utilities: CSV + assertion escaping", .timeLimit(.minutes(1)))
struct UtilsTests {
@Test("escapeAssertion replaces dots with underscores")
func testEscapeAssertion() {
Expand Down