
PaginationTest.pudu
Pudu44 lines2.7 KB
1/** @Test.Domain.Protocol.PaginationTest.Suite — cursors over list results */2module PuduLangMcp.Domain.Protocol.PaginationTest34import Std.Io as Io5import Std.Json as Json6import Std.Test as Test7import PuduLangMcp.Constants.Protocol as Protocol8import PuduLangMcp.Domain.Protocol.Pagination as Pagination9import PuduLangMcp.Errors.RpcError as RpcError101112fn failureCode(outcome: &Result[(Array[Int], Option[Str]), RpcError.ProtocolError]) -> Int {13 match outcome {14 case Ok(_) => 015 case Err(problem) => RpcError.code(&problem)16 }17}181920fn main() -> Int {21 let items = [1, 2, 3, 4, 5]22 let checks = Test.suite("Domain.Protocol.Pagination", &[23 Test.equals("no cursor starts at the beginning", &Pagination.page(&items, &None, 2), &Ok(([1, 2], Some("offset:2")))),24 Test.equals("a cursor continues where the last page stopped", &Pagination.page(&items, &Some("offset:2"), 2), &Ok(([3, 4], Some("offset:4")))),25 Test.equals("the last page has no next cursor", &Pagination.page(&items, &Some("offset:4"), 2), &Ok(([5], None))),26 Test.equals("a page that fits has no next cursor", &Pagination.page(&items, &None, 5), &Ok(([1, 2, 3, 4, 5], None))),27 Test.equals("an empty list is one empty page", &Pagination.page(&[], &None, 3), &Ok(([], None))),28 Test.equals("a cursor at the end is invalid", &failureCode(&Pagination.page(&items, &Some("offset:5"), 2)), &Protocol.INVALID_PARAMS),29 Test.equals("a cursor past the end is invalid", &failureCode(&Pagination.page(&items, &Some("offset:99"), 2)), &Protocol.INVALID_PARAMS),30 Test.equals("a negative offset is invalid", &failureCode(&Pagination.page(&items, &Some("offset:-1"), 2)), &Protocol.INVALID_PARAMS),31 Test.equals("a foreign cursor is invalid", &failureCode(&Pagination.page(&items, &Some("eyJwYWdlIjogM30="), 2)), &Protocol.INVALID_PARAMS),32 Test.equals("a cursor without digits is invalid", &failureCode(&Pagination.page(&items, &Some("offset:"), 2)), &Protocol.INVALID_PARAMS),33 Test.equals("a cursor with trailing text is invalid", &failureCode(&Pagination.page(&items, &Some("offset:1x"), 2)), &Protocol.INVALID_PARAMS),34 Test.equals("no cursor parameter reads as none", &Pagination.cursorOf(&Json.object(&[])), &Ok(None)),35 Test.equals("a string cursor is read", &Pagination.cursorOf(&Json.object(&[("cursor", Json.Text("offset:1"))])), &Ok(Some("offset:1"))),36 Test.that("a non-string cursor is invalid params", Pagination.cursorOf(&Json.object(&[("cursor", Json.Number(1))])) == Err(RpcError.InvalidParams("cursor must be a string")))37 ])38 let ran = Test.run(&checks)39 for failure in Test.failuresOf(&ran) {40 let _reported = Io.writeErrorLine(failure)41 }42 Test.report(&ran)43}44