1import gleam/list
2import gleeunit/should
3import plinth/javascript/storage
4
5pub fn get_throw_test() {
6 use <- run(True, False)
7 should.be_error(storage.local())
8 should.be_error(storage.session())
9}
10
11pub fn get_undef_test() {
12 use <- run(False, True)
13 should.be_error(storage.local())
14 should.be_error(storage.session())
15}
16
17pub fn get_set_test() {
18 use <- run(False, False)
19 let assert Ok(local) = storage.local()
20 should.be_ok(storage.set_item(local, "Foo", "Bar"))
21 should.equal(storage.get_item(local, "Foo"), Ok("Bar"))
22}
23
24pub fn set_limit_test() {
25 use <- run(False, False)
26 let assert Ok(session) = storage.session()
27 should.be_ok(storage.set_item(session, "Foo1", "Bar"))
28 should.be_ok(storage.set_item(session, "Foo2", "Bar"))
29 should.be_ok(storage.set_item(session, "Foo3", "Bar"))
30 should.be_ok(storage.set_item(session, "Foo4", "Bar"))
31 should.be_ok(storage.set_item(session, "Foo5", "Bar"))
32 should.be_error(storage.set_item(session, "Foo6", "Bar"))
33}
34
35pub fn length_test() {
36 use <- run(False, False)
37 let assert Ok(local) = storage.local()
38 should.be_ok(storage.set_item(local, "Foo", "Bar"))
39 should.be_ok(storage.set_item(local, "Foo2", "Bar"))
40 should.equal(storage.length(local), 2)
41}
42
43pub fn key_test() {
44 use <- run(False, False)
45 let assert Ok(local) = storage.local()
46 should.be_ok(storage.set_item(local, "Foo1", "Bar1"))
47 should.be_ok(storage.set_item(local, "Foo2", "Bar2"))
48 should.be_ok(storage.set_item(local, "Foo3", "Bar3"))
49 should.be_ok(storage.set_item(local, "Foo4", "Bar4"))
50 should.be_ok(storage.set_item(local, "Foo5", "Bar5"))
51
52 let indexes = [0, 1, 2, 3, 4]
53 let keys = list.try_map(indexes, fn(i) { storage.key(local, i) })
54 should.equal(keys, Ok(["Foo1", "Foo2", "Foo3", "Foo4", "Foo5"]))
55}
56
57pub fn key_fail_test() {
58 use <- run(False, False)
59 let assert Ok(local) = storage.local()
60 should.be_error(storage.key(local, 1))
61}
62
63pub fn remove_test() {
64 use <- run(False, False)
65 let assert Ok(local) = storage.local()
66 should.equal(storage.remove_item(local, "not here"), Nil)
67 should.be_ok(storage.set_item(local, "Foo", "Bar"))
68 should.equal(storage.remove_item(local, "Foo"), Nil)
69 should.be_error(storage.get_item(local, "Foo"))
70}
71
72pub fn clear_test() {
73 use <- run(False, False)
74 let assert Ok(session) = storage.session()
75 should.be_ok(storage.set_item(session, "Foo1", "Bar"))
76 should.be_ok(storage.set_item(session, "Foo2", "Bar"))
77 should.be_ok(storage.set_item(session, "Foo3", "Bar"))
78 should.be_ok(storage.set_item(session, "Foo4", "Bar"))
79 should.be_ok(storage.set_item(session, "Foo5", "Bar"))
80 storage.clear(session)
81 should.equal(storage.length(session), 0)
82}
83
84@external(javascript, "../storage_test_ffi.mjs", "runWithMockStorage")
85fn run(should_throw: Bool, should_undef: Bool, callback: fn() -> a) -> Nil