"""Notes CRUD driven over HTTP against a live Django server.""" from django.test import LiveServerTestCase from tests.live_http import LiveRPCMixin class NotesCRUDTests(LiveRPCMixin, LiveServerTestCase): def setUp(self): self.session_init() def test_list_notes_empty(self): result = self.result("list_notes") self.assertEqual(result["notes"], []) self.assertEqual(result["count"], 0) def test_create_note(self): result = self.result("create_note", {"title": "First Note", "content": "Hello!"}) self.assertEqual(result["title"], "First Note") self.assertEqual(result["content"], "Hello!") self.assertFalse(result["pinned"]) self.assertIn("id", result) self.assertIn("created_at", result) def test_create_and_list(self): self.result("create_note", {"title": "Note A"}) self.result("create_note", {"title": "Note B"}) result = self.result("list_notes") self.assertEqual(result["count"], 2) titles = [n["title"] for n in result["notes"]] self.assertIn("Note A", titles) self.assertIn("Note B", titles) def test_get_note_by_id(self): note_id = self.result("create_note", {"title": "Get Me", "content": "Specific"})["id"] result = self.result("get_note", {"id": note_id}) self.assertEqual(result["id"], note_id) self.assertEqual(result["title"], "Get Me") def test_update_note(self): note_id = self.result("create_note", {"title": "Original"})["id"] result = self.result("update_note", {"id": note_id, "title": "Updated"}) self.assertEqual(result["title"], "Updated") def test_update_note_pin(self): note_id = self.result("create_note", {"title": "Pin Me"})["id"] result = self.result("update_note", {"id": note_id, "pinned": True}) self.assertTrue(result["pinned"]) def test_delete_note(self): note_id = self.result("create_note", {"title": "Delete Me"})["id"] self.assertTrue(self.result("delete_note", {"id": note_id})["deleted"]) # get_note raises ValueError for a missing row, which the executor maps # onto the generic internal-error envelope rather than a 404. reply = self.call("get_note", {"id": note_id}) self.assertEqual(reply.status, 500) self.assertEqual(reply.body["code"], "INTERNAL_ERROR") def test_delete_absent_note_reports_not_deleted(self): result = self.result("delete_note", {"id": 424242}) self.assertFalse(result["deleted"]) def test_pinned_notes_sort_first(self): self.result("create_note", {"title": "Unpinned"}) self.result("create_note", {"title": "Pinned", "pinned": True}) result = self.result("list_notes") self.assertEqual(result["notes"][0]["title"], "Pinned") def test_full_lifecycle(self): note_id = self.result("create_note", {"title": "Lifecycle", "content": "v1"})["id"] self.result("update_note", {"id": note_id, "content": "v2"}) self.result("update_note", {"id": note_id, "pinned": True}) fetched = self.result("get_note", {"id": note_id}) self.assertEqual(fetched["title"], "Lifecycle") self.assertEqual(fetched["content"], "v2") self.assertTrue(fetched["pinned"]) self.assertTrue(self.result("delete_note", {"id": note_id})["deleted"])