aboutsummaryrefslogtreecommitdiff
path: root/internal/admin/api_room_insert_remove_test.go
diff options
context:
space:
mode:
authorhistoria <[not public]>2026-07-09 05:27:10 -0400
committerhistoria <[not public]>2026-07-09 05:27:10 -0400
commitc705ae942573984784ef501bf8198f61f5206ddd (patch)
treec964066f3a244002bf75cb50a877630f46496f81 /internal/admin/api_room_insert_remove_test.go
parent74153c7814fc4cef988066ef04e38731a943bc12 (diff)
downloadthehouseoficarus-c705ae942573984784ef501bf8198f61f5206ddd.tar.gz
refactor: simplify yaml, remove support for old scalar fields
Diffstat (limited to 'internal/admin/api_room_insert_remove_test.go')
-rw-r--r--internal/admin/api_room_insert_remove_test.go101
1 files changed, 51 insertions, 50 deletions
diff --git a/internal/admin/api_room_insert_remove_test.go b/internal/admin/api_room_insert_remove_test.go
index 5a3b28e..6d80595 100644
--- a/internal/admin/api_room_insert_remove_test.go
+++ b/internal/admin/api_room_insert_remove_test.go
@@ -11,6 +11,7 @@ import (
"strings"
"testing"
+ "thehouseoficarus/internal/behavior"
"thehouseoficarus/internal/world"
)
@@ -93,8 +94,8 @@ func postRemove(t *testing.T, s *AdminServer, body string) (map[string]any, int)
// rewires A and B onto it, and pushes an undo entry that restores everything.
func TestInsertSuccess(t *testing.T) {
s := newTestAdminServer(t, map[int]string{
- 1: "name: A\nexits:\n east: 2\n",
- 2: "name: B\nexits:\n west: 1\n",
+ 1: "name: A\nexits:\n east: {room: 2}\n",
+ 2: "name: B\nexits:\n west: {room: 1}\n",
})
resp, code := postInsert(t, s, `{"from":1,"dir":"east","name":"Mid"}`)
@@ -157,8 +158,8 @@ func TestInsertSuccess(t *testing.T) {
// TestInsertDefaultName confirms an empty name falls back to "Room #<id>".
func TestInsertDefaultName(t *testing.T) {
s := newTestAdminServer(t, map[int]string{
- 1: "name: A\nexits:\n east: 2\n",
- 2: "name: B\nexits:\n west: 1\n",
+ 1: "name: A\nexits:\n east: {room: 2}\n",
+ 2: "name: B\nexits:\n west: {room: 1}\n",
})
resp, code := postInsert(t, s, `{"from":1,"dir":"east","name":""}`)
if code != http.StatusOK {
@@ -177,14 +178,14 @@ func TestInsertGridConflict(t *testing.T) {
// 1→east→2→east→3 and 1→south→4→east→5→east→6→east→7→north→8 at (3,0,0).
// Inserting between 1 and 2 pushes 3 to (3,0,0), colliding with 8.
s := newTestAdminServer(t, map[int]string{
- 1: "name: A\nexits:\n east: 2\n south: 4\n",
- 2: "name: B\nexits:\n east: 3\n west: 1\n",
- 3: "name: C\nexits:\n west: 2\n",
- 4: "name: D\nexits:\n east: 5\n north: 1\n",
- 5: "name: E\nexits:\n east: 6\n west: 4\n",
- 6: "name: F\nexits:\n east: 7\n west: 5\n",
- 7: "name: G\nexits:\n north: 8\n west: 6\n",
- 8: "name: H\nexits:\n south: 7\n",
+ 1: "name: A\nexits:\n east: {room: 2}\n south: {room: 4}\n",
+ 2: "name: B\nexits:\n east: {room: 3}\n west: {room: 1}\n",
+ 3: "name: C\nexits:\n west: {room: 2}\n",
+ 4: "name: D\nexits:\n east: {room: 5}\n north: {room: 1}\n",
+ 5: "name: E\nexits:\n east: {room: 6}\n west: {room: 4}\n",
+ 6: "name: F\nexits:\n east: {room: 7}\n west: {room: 5}\n",
+ 7: "name: G\nexits:\n north: {room: 8}\n west: {room: 6}\n",
+ 8: "name: H\nexits:\n south: {room: 7}\n",
})
resp, code := postInsert(t, s, `{"from":1,"dir":"east","name":"X"}`)
if code != http.StatusConflict {
@@ -210,9 +211,9 @@ func TestInsertGridConflict(t *testing.T) {
// undo/redo round-trip.
func TestRemoveSuccess(t *testing.T) {
s := newTestAdminServer(t, map[int]string{
- 1: "name: A\nexits:\n east: 2\n",
- 2: "name: B\nexits:\n east: 3\n west: 1\n",
- 3: "name: C\nexits:\n west: 2\n",
+ 1: "name: A\nexits:\n east: {room: 2}\n",
+ 2: "name: B\nexits:\n east: {room: 3}\n west: {room: 1}\n",
+ 3: "name: C\nexits:\n west: {room: 2}\n",
})
resp, code := postRemove(t, s, `{"from":1,"dir":"east"}`)
if code != http.StatusOK {
@@ -282,8 +283,8 @@ func TestRemoveGuards(t *testing.T) {
{
name: "no such exit",
rooms: map[int]string{
- 1: "name: A\nexits:\n east: 2\n",
- 2: "name: B\nexits:\n west: 1\n",
+ 1: "name: A\nexits:\n east: {room: 2}\n",
+ 2: "name: B\nexits:\n west: {room: 1}\n",
},
body: `{"from":1,"dir":"north"}`,
want: "has no north exit",
@@ -291,7 +292,7 @@ func TestRemoveGuards(t *testing.T) {
{
name: "self loop",
rooms: map[int]string{
- 1: "name: A\nexits:\n east: 1\n",
+ 1: "name: A\nexits:\n east: {room: 1}\n",
},
body: `{"from":1,"dir":"east"}`,
want: "loops back",
@@ -299,9 +300,9 @@ func TestRemoveGuards(t *testing.T) {
{
name: "not an insert chain (B does not lead back)",
rooms: map[int]string{
- 1: "name: A\nexits:\n east: 2\n",
- 2: "name: B\nexits:\n east: 3\n",
- 3: "name: C\nexits:\n west: 2\n",
+ 1: "name: A\nexits:\n east: {room: 2}\n",
+ 2: "name: B\nexits:\n east: {room: 3}\n",
+ 3: "name: C\nexits:\n west: {room: 2}\n",
},
body: `{"from":1,"dir":"east"}`,
want: "not an insert chain",
@@ -309,8 +310,8 @@ func TestRemoveGuards(t *testing.T) {
{
name: "dead end (B has no forward exit)",
rooms: map[int]string{
- 1: "name: A\nexits:\n east: 2\n",
- 2: "name: B\nexits:\n west: 1\n",
+ 1: "name: A\nexits:\n east: {room: 2}\n",
+ 2: "name: B\nexits:\n west: {room: 1}\n",
},
body: `{"from":1,"dir":"east"}`,
want: "no room beyond",
@@ -318,10 +319,10 @@ func TestRemoveGuards(t *testing.T) {
{
name: "B has extra exits",
rooms: map[int]string{
- 1: "name: A\nexits:\n east: 2\n",
- 2: "name: B\nexits:\n east: 3\n west: 1\n north: 4\n",
- 3: "name: C\nexits:\n west: 2\n",
- 4: "name: D\nexits:\n south: 2\n",
+ 1: "name: A\nexits:\n east: {room: 2}\n",
+ 2: "name: B\nexits:\n east: {room: 3}\n west: {room: 1}\n north: {room: 4}\n",
+ 3: "name: C\nexits:\n west: {room: 2}\n",
+ 4: "name: D\nexits:\n south: {room: 2}\n",
},
body: `{"from":1,"dir":"east"}`,
want: "other exits besides",
@@ -329,10 +330,10 @@ func TestRemoveGuards(t *testing.T) {
{
name: "C does not lead back to B",
rooms: map[int]string{
- 1: "name: A\nexits:\n east: 2\n",
- 2: "name: B\nexits:\n east: 3\n west: 1\n",
- 3: "name: C\nexits:\n east: 4\n",
- 4: "name: D\nexits:\n west: 3\n",
+ 1: "name: A\nexits:\n east: {room: 2}\n",
+ 2: "name: B\nexits:\n east: {room: 3}\n west: {room: 1}\n",
+ 3: "name: C\nexits:\n east: {room: 4}\n",
+ 4: "name: D\nexits:\n west: {room: 3}\n",
},
body: `{"from":1,"dir":"east"}`,
want: "does not lead back to",
@@ -363,12 +364,12 @@ func TestRemoveGridConflict(t *testing.T) {
// to (1,0,0); 6 (at 3's old south neighbor (2,1,0)) follows to (1,1,0)? No
// — the pull shifts the whole beyond-component; 6 lands on 5's cell (1,1,0).
s := newTestAdminServer(t, map[int]string{
- 1: "name: A\nexits:\n east: 2\n south: 4\n",
- 2: "name: B\nexits:\n east: 3\n west: 1\n",
- 3: "name: C\nexits:\n south: 6\n west: 2\n",
- 4: "name: D\nexits:\n east: 5\n north: 1\n",
- 5: "name: E\nexits:\n west: 4\n",
- 6: "name: F\nexits:\n north: 3\n",
+ 1: "name: A\nexits:\n east: {room: 2}\n south: {room: 4}\n",
+ 2: "name: B\nexits:\n east: {room: 3}\n west: {room: 1}\n",
+ 3: "name: C\nexits:\n south: {room: 6}\n west: {room: 2}\n",
+ 4: "name: D\nexits:\n east: {room: 5}\n north: {room: 1}\n",
+ 5: "name: E\nexits:\n west: {room: 4}\n",
+ 6: "name: F\nexits:\n north: {room: 3}\n",
})
resp, code := postRemove(t, s, `{"from":1,"dir":"east"}`)
if code != http.StatusConflict {
@@ -394,10 +395,10 @@ func TestRemoveGridConflict(t *testing.T) {
// room points into B, and that the message names the count.
func TestRemoveExtraInbound(t *testing.T) {
s := newTestAdminServer(t, map[int]string{
- 1: "name: A\nexits:\n east: 2\n",
- 2: "name: B\nexits:\n east: 3\n west: 1\n",
- 3: "name: C\nexits:\n west: 2\n",
- 9: "name: X\nexits:\n north: 2\n", // extra inbound edge into B
+ 1: "name: A\nexits:\n east: {room: 2}\n",
+ 2: "name: B\nexits:\n east: {room: 3}\n west: {room: 1}\n",
+ 3: "name: C\nexits:\n west: {room: 2}\n",
+ 9: "name: X\nexits:\n north: {room: 2}\n", // extra inbound edge into B
})
resp, code := postRemove(t, s, `{"from":1,"dir":"east"}`)
if code != http.StatusBadRequest {
@@ -418,12 +419,12 @@ func TestNextRoomIDNoCrossSubdirCollision(t *testing.T) {
t.Fatal(err)
}
// Room 1 in root, room 2 in a subdirectory "zone".
- writeRoomFile(t, dir, 1, "name: A\nexits:\n east: 2\n")
+ writeRoomFile(t, dir, 1, "name: A\nexits:\n east: {room: 2}\n")
zoneDir := filepath.Join(roomsDir, "zone")
if err := os.MkdirAll(zoneDir, 0o755); err != nil {
t.Fatal(err)
}
- if err := os.WriteFile(filepath.Join(zoneDir, "2.yaml"), []byte("name: B\nexits:\n west: 1\n"), 0o644); err != nil {
+ if err := os.WriteFile(filepath.Join(zoneDir, "2.yaml"), []byte("name: B\nexits:\n west: {room: 1}\n"), 0o644); err != nil {
t.Fatal(err)
}
s := &AdminServer{
@@ -461,8 +462,8 @@ func testMobDef() *world.MobDef {
// instances for the (now-deleted) new room, via rebuildAfterUndo's stat check.
func TestUndoInsertClearsMobs(t *testing.T) {
s := newTestAdminServer(t, map[int]string{
- 1: "name: A\nexits:\n east: 2\n",
- 2: "name: B\nexits:\n west: 1\n",
+ 1: "name: A\nexits:\n east: {room: 2}\n",
+ 2: "name: B\nexits:\n west: {room: 1}\n",
})
resp, code := postInsert(t, s, `{"from":1,"dir":"east","name":"Mid"}`)
if code != http.StatusOK {
@@ -471,7 +472,7 @@ func TestUndoInsertClearsMobs(t *testing.T) {
newID := int(resp["room"].(map[string]any)["id"].(float64))
// Spawn a transient mob in the new room so the store has something to clear.
- inst := s.mobStore.SpawnTransient(testMobDef(), &world.SpawnMobConfig{ID: "testmob"}, newID, "")
+ inst := s.mobStore.SpawnTransient(testMobDef(), &behavior.SpawnMobConfig{ID: "testmob"}, newID, "")
if inst == nil {
t.Fatal("SpawnTransient returned nil")
}
@@ -494,9 +495,9 @@ func TestUndoInsertClearsMobs(t *testing.T) {
// for the re-deleted room.
func TestRedoRemoveClearsMobs(t *testing.T) {
s := newTestAdminServer(t, map[int]string{
- 1: "name: A\nexits:\n east: 2\n",
- 2: "name: B\nexits:\n east: 3\n west: 1\n",
- 3: "name: C\nexits:\n west: 2\n",
+ 1: "name: A\nexits:\n east: {room: 2}\n",
+ 2: "name: B\nexits:\n east: {room: 3}\n west: {room: 1}\n",
+ 3: "name: C\nexits:\n west: {room: 2}\n",
})
if _, code := postRemove(t, s, `{"from":1,"dir":"east"}`); code != http.StatusOK {
t.Fatal("remove failed")
@@ -510,7 +511,7 @@ func TestRedoRemoveClearsMobs(t *testing.T) {
if !roomExists(s, 2) {
t.Fatal("precondition: B should exist after undo")
}
- s.mobStore.SpawnTransient(testMobDef(), &world.SpawnMobConfig{ID: "testmob"}, 2, "")
+ s.mobStore.SpawnTransient(testMobDef(), &behavior.SpawnMobConfig{ID: "testmob"}, 2, "")
if got := len(s.mobStore.MobsInRoom(2)); got != 1 {
t.Fatalf("precondition: expected 1 mob in B, got %d", got)
}