agi.meetroom_test.go 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131
  1. package agi
  2. import (
  3. "path/filepath"
  4. "strings"
  5. "testing"
  6. "imuslab.com/arozos/mod/meetroom"
  7. "imuslab.com/arozos/mod/sharedspace"
  8. )
  9. // spaceBoundRoomManager builds the meetroom + sharedspace manager pair the
  10. // way MeetRoomInit wires them in production.
  11. func spaceBoundRoomManager(t *testing.T) (*meetroom.Manager, *sharedspace.Manager) {
  12. t.Helper()
  13. rm := meetroom.NewManager(filepath.Join(t.TempDir(), "attachments"))
  14. sm := sharedspace.NewManager(filepath.Join(t.TempDir(), "spaces"), 0)
  15. rm.BindSpaceManager(sm)
  16. return rm, sm
  17. }
  18. func TestAgiDescribeRoom(t *testing.T) {
  19. rm, _ := spaceBoundRoomManager(t)
  20. room := rm.CreateRoom("alice", "Standup", "hunter2")
  21. tests := []struct {
  22. name string
  23. includeSpace bool
  24. }{
  25. {"with space capability", true},
  26. {"without space capability", false},
  27. }
  28. for _, tt := range tests {
  29. t.Run(tt.name, func(t *testing.T) {
  30. desc := agiDescribeRoom(room, tt.includeSpace)
  31. if desc["roomid"] != room.ID {
  32. t.Errorf("roomid = %v, want %v", desc["roomid"], room.ID)
  33. }
  34. if desc["displayid"] != meetroom.FormatRoomID(room.ID) {
  35. t.Errorf("displayid = %v, want formatted ID", desc["displayid"])
  36. }
  37. if desc["title"] != "Standup" || desc["host"] != "alice" {
  38. t.Errorf("title/host = %v/%v", desc["title"], desc["host"])
  39. }
  40. if desc["protected"] != true {
  41. t.Errorf("protected = %v, want true", desc["protected"])
  42. }
  43. spaceID, revealed := desc["spaceid"]
  44. if tt.includeSpace && (!revealed || spaceID != room.SpaceID) {
  45. t.Errorf("spaceid not revealed to authorized caller")
  46. }
  47. if !tt.includeSpace && revealed {
  48. t.Errorf("spaceid leaked to unauthorized caller")
  49. }
  50. })
  51. }
  52. }
  53. func TestAgiAttendanceList(t *testing.T) {
  54. rm, _ := spaceBoundRoomManager(t)
  55. room := rm.CreateRoom("alice", "", "")
  56. host, _ := room.AddParticipant("alice")
  57. guest, _ := room.AddParticipant("bob")
  58. room.RemoveParticipant(guest.PeerID)
  59. _ = host
  60. list := agiAttendanceList(room.Attendance())
  61. if len(list) != 2 {
  62. t.Fatalf("attendance list length = %d, want 2", len(list))
  63. }
  64. if list[0]["username"] != "alice" || list[0]["present"] != true {
  65. t.Errorf("host entry = %+v, want present alice", list[0])
  66. }
  67. if list[0]["leftat"] != int64(0) {
  68. t.Errorf("present entry leftat = %v, want 0", list[0]["leftat"])
  69. }
  70. if list[1]["username"] != "bob" || list[1]["present"] != false {
  71. t.Errorf("guest entry = %+v, want departed bob", list[1])
  72. }
  73. if list[1]["leftat"] == int64(0) {
  74. t.Errorf("departed entry has zero leftat")
  75. }
  76. }
  77. func TestAgiDescribeSpaceAndItem(t *testing.T) {
  78. sm := sharedspace.NewManager(filepath.Join(t.TempDir(), "spaces"), 0)
  79. space := sm.CreateSpace("alice", "Notes")
  80. textItem, err := space.AddText("alice", "hello", "agi")
  81. if err != nil {
  82. t.Fatalf("AddText() error = %v", err)
  83. }
  84. blobItem, err := space.SaveBlob(sharedspace.ItemTypeImage, "pic.png", "bob", "agi", strings.NewReader("img"), 1024)
  85. if err != nil {
  86. t.Fatalf("SaveBlob() error = %v", err)
  87. }
  88. desc := agiDescribeSpace(space)
  89. if desc["spaceid"] != space.ID || desc["name"] != "Notes" || desc["owner"] != "alice" {
  90. t.Errorf("space description = %+v", desc)
  91. }
  92. if desc["items"] != 2 {
  93. t.Errorf("space item count = %v, want 2", desc["items"])
  94. }
  95. textDesc := agiDescribeItem(textItem)
  96. if textDesc["type"] != sharedspace.ItemTypeText || textDesc["text"] != "hello" {
  97. t.Errorf("text item description = %+v", textDesc)
  98. }
  99. blobDesc := agiDescribeItem(blobItem)
  100. if blobDesc["type"] != sharedspace.ItemTypeImage || blobDesc["name"] != "pic.png" {
  101. t.Errorf("blob item description = %+v", blobDesc)
  102. }
  103. if blobDesc["size"] != int64(3) || blobDesc["uploader"] != "bob" {
  104. t.Errorf("blob size/uploader = %v/%v", blobDesc["size"], blobDesc["uploader"])
  105. }
  106. }
  107. func TestMeetRoomLibRegistration(t *testing.T) {
  108. rm, sm := spaceBoundRoomManager(t)
  109. wired := minimalGateway()
  110. wired.Option.MeetRoomManager = rm
  111. wired.Option.SharedSpaceManager = sm
  112. wired.MeetRoomLibRegister()
  113. wired.SharedSpaceLibRegister()
  114. if _, ok := wired.LoadedAGILibrary["meetroom"]; !ok {
  115. t.Errorf("meetroom lib not registered")
  116. }
  117. if _, ok := wired.LoadedAGILibrary["sharedspace"]; !ok {
  118. t.Errorf("sharedspace lib not registered")
  119. }
  120. }