owenrusk.dev

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()