casebench
test cases straight onto the board.
git clone https://owenrusk.dev/casebench.git
casebench / tests/test_commands.py -rw-r--r-- · 4989 bytes
1 import io
2 import tempfile
3 import unittest
4 from unittest import mock
5
6 from casebench.memstore import MemStore
7
8 from .helpers import UMBRELLA, run
9
10
11 class PutTest(unittest.TestCase):
12 def setUp(self):
13 self.store = MemStore(("owen", "tess"))
14 self.owen = self.store.player("owen")
15
16 def test_put(self):
17 code, out, _ = run(self.store, "put", str(UMBRELLA), "--player", "owen")
18 self.assertEqual(code, 0)
19 self.assertEqual(out, "owen: put test-lost-umbrella\n")
20 self.assertEqual(self.store.items(self.owen, "test-lost-umbrella"), ["ticket", "log", "umbrella"])
21 self.assertIsNone(self.store.placed(self.store.player("tess"), "test-lost-umbrella"))
22 self.assertEqual([image.mime for image in self.store.media.values()], ["image/svg+xml"])
23
24 def test_putting_again_keeps_notes_and_lock(self):
25 run(self.store, "put", str(UMBRELLA), "--player", "owen")
26 run(self.store, "note", "test-lost-umbrella", "keep me", "--player", "owen")
27 run(self.store, "lock", "test-lost-umbrella", "--answer", "a", "--player", "owen")
28 run(self.store, "put", str(UMBRELLA), "--player", "owen")
29 self.assertEqual(self.store.notes(self.owen, "test-lost-umbrella"), [(None, "keep me")])
30 self.assertIsNotNone(self.store.get_lock(self.owen, "test-lost-umbrella"))
31
32 def test_every_board(self):
33 code, out, _ = run(self.store, "put", str(UMBRELLA), "--all")
34 self.assertEqual(code, 0)
35 self.assertEqual(out, "owen: put test-lost-umbrella\ntess: put test-lost-umbrella\n")
36
37 def test_more_than_one_player(self):
38 run(self.store, "put", str(UMBRELLA), "--player", "tess", "--player", "owen")
39 for who in self.store.players():
40 self.assertIsNotNone(self.store.placed(who, "test-lost-umbrella"))
41
42 def test_needs_a_board(self):
43 with self.assertRaises(SystemExit):
44 run(self.store, "put", str(UMBRELLA))
45
46 def test_one_refusal_writes_nothing(self):
47 self.store.runtime_case(self.store.player("tess"), "test-lost-umbrella", "Something real")
48 code, _, _ = run(self.store, "put", str(UMBRELLA), "--all")
49 self.assertEqual(code, 1)
50 self.assertIsNone(self.store.placed(self.owen, "test-lost-umbrella"))
51
52 def test_no_such_player(self):
53 code, _, err = run(self.store, "put", str(UMBRELLA), "--player", "nobody")
54 self.assertEqual(code, 1)
55 self.assertIn("no player nobody", err)
56
57 def test_leaves_the_runtime_alone(self):
58 self.store.runtime_case(self.owen, "test-lost-umbrella", "Something real")
59 code, _, err = run(self.store, "put", str(UMBRELLA), "--player", "owen")
60 self.assertEqual(code, 1)
61 self.assertIn("from the runtime", err)
62 self.assertEqual(self.store.placed(self.owen, "test-lost-umbrella").title, "Something real")
63
64
65 class NoteTest(unittest.TestCase):
66 def setUp(self):
67 self.store = MemStore(("owen",))
68 self.owen = self.store.player("owen")
69 run(self.store, "put", str(UMBRELLA), "--player", "owen")
70
71 def test_under_the_title(self):
72 code, _, _ = run(self.store, "note", "test-lost-umbrella", "check the coat rack", "--player", "owen")
73 self.assertEqual(code, 0)
74 self.assertEqual(self.store.notes(self.owen, "test-lost-umbrella"), [(None, "check the coat rack")])
75
76 def test_on_an_item(self):
77 run(self.store, "note", "test-lost-umbrella", "same number", "--item", "ticket", "--player", "owen")
78 self.assertEqual(self.store.notes(self.owen, "test-lost-umbrella"), [("ticket", "same number")])
79
80 def test_from_a_file_and_stdin(self):
81 with tempfile.NamedTemporaryFile("w", suffix=".md", delete_on_close=False) as f:
82 f.write("**114**\n")
83 f.close()
84 run(self.store, "note", "test-lost-umbrella", "-f", f.name, "--item", "ticket", "--player", "owen")
85 with mock.patch("sys.stdin", io.StringIO("from stdin\n")):
86 run(self.store, "note", "test-lost-umbrella", "-f", "-", "--player", "owen")
87 self.assertEqual(
88 self.store.notes(self.owen, "test-lost-umbrella"), [("ticket", "**114**"), (None, "from stdin")]
89 )
90
91 def test_no_such_item(self):
92 code, _, err = run(self.store, "note", "test-lost-umbrella", "x", "--item", "hat", "--player", "owen")
93 self.assertEqual(code, 1)
94 self.assertIn("no item hat", err)
95
96 def test_empty_note(self):
97 code, _, err = run(self.store, "note", "test-lost-umbrella", " \n", "--player", "owen")
98 self.assertEqual(code, 1)
99 self.assertIn("nothing to write", err)
100 self.assertEqual(self.store.notes(self.owen, "test-lost-umbrella"), [])
101
102 def test_case_not_on_board(self):
103 code, _, err = run(self.store, "note", "test-other", "x", "--player", "owen")
104 self.assertEqual(code, 1)
105 self.assertIn("doesn't have test-other", err)
106
107
108 if __name__ == "__main__":
109 unittest.main()