An ATProto Lexicon validator for Gleam.
1import gleam/json
2import gleeunit
3import gleeunit/should
4import honk/validation/context
5import honk/validation/meta/token
6
7pub fn main() {
8 gleeunit.main()
9}
10
11// ========== SCHEMA VALIDATION TESTS ==========
12
13pub fn valid_token_schema_test() {
14 let schema = json.object([#("type", json.string("token"))])
15
16 let assert Ok(ctx) = context.builder() |> context.build
17
18 token.validate_schema(schema, ctx) |> should.be_ok
19}
20
21pub fn valid_token_schema_with_description_test() {
22 let schema =
23 json.object([
24 #("type", json.string("token")),
25 #("description", json.string("A token for discrimination")),
26 ])
27
28 let assert Ok(ctx) = context.builder() |> context.build
29
30 token.validate_schema(schema, ctx) |> should.be_ok
31}
32
33pub fn invalid_token_schema_extra_fields_test() {
34 let schema =
35 json.object([
36 #("type", json.string("token")),
37 #("extraField", json.string("not allowed")),
38 ])
39
40 let assert Ok(ctx) = context.builder() |> context.build
41
42 token.validate_schema(schema, ctx) |> should.be_error
43}
44
45// ========== DATA VALIDATION TESTS ==========
46
47pub fn valid_token_data_simple_string_test() {
48 let schema = json.object([#("type", json.string("token"))])
49 let data = json.string("example.lexicon.record#demoToken")
50
51 let assert Ok(ctx) = context.builder() |> context.build
52
53 token.validate_data(data, schema, ctx) |> should.be_ok
54}
55
56pub fn valid_token_data_local_ref_test() {
57 let schema = json.object([#("type", json.string("token"))])
58 let data = json.string("#myToken")
59
60 let assert Ok(ctx) = context.builder() |> context.build
61
62 token.validate_data(data, schema, ctx) |> should.be_ok
63}
64
65pub fn invalid_token_data_empty_string_test() {
66 let schema = json.object([#("type", json.string("token"))])
67 let data = json.string("")
68
69 let assert Ok(ctx) = context.builder() |> context.build
70
71 token.validate_data(data, schema, ctx) |> should.be_error
72}
73
74pub fn invalid_token_data_integer_test() {
75 let schema = json.object([#("type", json.string("token"))])
76 let data = json.int(123)
77
78 let assert Ok(ctx) = context.builder() |> context.build
79
80 token.validate_data(data, schema, ctx) |> should.be_error
81}
82
83pub fn invalid_token_data_boolean_test() {
84 let schema = json.object([#("type", json.string("token"))])
85 let data = json.bool(True)
86
87 let assert Ok(ctx) = context.builder() |> context.build
88
89 token.validate_data(data, schema, ctx) |> should.be_error
90}
91
92pub fn invalid_token_data_object_test() {
93 let schema = json.object([#("type", json.string("token"))])
94 let data = json.object([#("token", json.string("value"))])
95
96 let assert Ok(ctx) = context.builder() |> context.build
97
98 token.validate_data(data, schema, ctx) |> should.be_error
99}
100
101pub fn invalid_token_data_array_test() {
102 let schema = json.object([#("type", json.string("token"))])
103 let data =
104 json.preprocessed_array([json.string("token1"), json.string("token2")])
105
106 let assert Ok(ctx) = context.builder() |> context.build
107
108 token.validate_data(data, schema, ctx) |> should.be_error
109}
110
111pub fn invalid_token_data_null_test() {
112 let schema = json.object([#("type", json.string("token"))])
113 let data = json.null()
114
115 let assert Ok(ctx) = context.builder() |> context.build
116
117 token.validate_data(data, schema, ctx) |> should.be_error
118}