6 "github.com/stretchr/testify/assert"
7 "github.com/stretchr/testify/mock"
17 func TestHandleSetChatSubject(t *testing.T) {
29 name: "sends chat subject to private chat members",
32 UserName: []byte{0x00, 0x01},
34 PrivateChats: map[uint32]*PrivateChat{
37 ClientConn: map[uint16]*ClientConn{
40 Access: accessBitmap{255, 255, 255, 255, 255, 255, 255, 255},
46 Access: accessBitmap{255, 255, 255, 255, 255, 255, 255, 255},
53 Clients: map[uint16]*ClientConn{
56 Access: accessBitmap{255, 255, 255, 255, 255, 255, 255, 255},
62 Access: accessBitmap{255, 255, 255, 255, 255, 255, 255, 255},
72 Type: []byte{0, 0x6a},
73 ID: []byte{0, 0, 0, 1},
74 ErrorCode: []byte{0, 0, 0, 0},
76 NewField(fieldChatID, []byte{0, 0, 0, 1}),
77 NewField(fieldChatSubject, []byte("Test Subject")),
83 clientID: &[]byte{0, 1},
86 Type: []byte{0, 0x77},
87 ID: []byte{0x9a, 0xcb, 0x04, 0x42}, // Random ID from rand.Seed(1)
88 ErrorCode: []byte{0, 0, 0, 0},
90 NewField(fieldChatID, []byte{0, 0, 0, 1}),
91 NewField(fieldChatSubject, []byte("Test Subject")),
95 clientID: &[]byte{0, 2},
98 Type: []byte{0, 0x77},
99 ID: []byte{0xf0, 0xc5, 0x34, 0x1e}, // Random ID from rand.Seed(1)
100 ErrorCode: []byte{0, 0, 0, 0},
102 NewField(fieldChatID, []byte{0, 0, 0, 1}),
103 NewField(fieldChatSubject, []byte("Test Subject")),
110 for _, tt := range tests {
111 rand.Seed(1) // reset seed between tests to make transaction IDs predictable
113 t.Run(tt.name, func(t *testing.T) {
114 got, err := HandleSetChatSubject(tt.args.cc, tt.args.t)
115 if (err != nil) != tt.wantErr {
116 t.Errorf("HandleSetChatSubject() error = %v, wantErr %v", err, tt.wantErr)
119 if !assert.Equal(t, tt.want, got) {
120 t.Errorf("HandleSetChatSubject() got = %v, want %v", got, tt.want)
126 func TestHandleLeaveChat(t *testing.T) {
138 name: "returns expected transactions",
143 PrivateChats: map[uint32]*PrivateChat{
145 ClientConn: map[uint16]*ClientConn{
148 Access: accessBitmap{255, 255, 255, 255, 255, 255, 255, 255},
154 Access: accessBitmap{255, 255, 255, 255, 255, 255, 255, 255},
161 Clients: map[uint16]*ClientConn{
164 Access: accessBitmap{255, 255, 255, 255, 255, 255, 255, 255},
170 Access: accessBitmap{255, 255, 255, 255, 255, 255, 255, 255},
177 t: NewTransaction(tranDeleteUser, nil, NewField(fieldChatID, []byte{0, 0, 0, 1})),
181 clientID: &[]byte{0, 1},
184 Type: []byte{0, 0x76},
185 ID: []byte{0x9a, 0xcb, 0x04, 0x42}, // Random ID from rand.Seed(1)
186 ErrorCode: []byte{0, 0, 0, 0},
188 NewField(fieldChatID, []byte{0, 0, 0, 1}),
189 NewField(fieldUserID, []byte{0, 2}),
196 for _, tt := range tests {
198 t.Run(tt.name, func(t *testing.T) {
199 got, err := HandleLeaveChat(tt.args.cc, tt.args.t)
200 if (err != nil) != tt.wantErr {
201 t.Errorf("HandleLeaveChat() error = %v, wantErr %v", err, tt.wantErr)
204 if !assert.Equal(t, tt.want, got) {
205 t.Errorf("HandleLeaveChat() got = %v, want %v", got, tt.want)
211 func TestHandleGetUserNameList(t *testing.T) {
223 name: "replies with userlist transaction",
229 Clients: map[uint16]*ClientConn{
234 UserName: []byte{0, 4},
240 UserName: []byte{0, 4},
246 ID: []byte{0, 0, 0, 1},
252 clientID: &[]byte{1, 1},
256 ID: []byte{0, 0, 0, 1},
257 ErrorCode: []byte{0, 0, 0, 0},
260 fieldUsernameWithInfo,
261 []byte{00, 01, 00, 02, 00, 03, 00, 02, 00, 04},
264 fieldUsernameWithInfo,
265 []byte{00, 02, 00, 02, 00, 03, 00, 02, 00, 04},
273 for _, tt := range tests {
274 t.Run(tt.name, func(t *testing.T) {
275 got, err := HandleGetUserNameList(tt.args.cc, tt.args.t)
276 if (err != nil) != tt.wantErr {
277 t.Errorf("HandleGetUserNameList() error = %v, wantErr %v", err, tt.wantErr)
280 assert.Equal(t, tt.want, got)
285 func TestHandleChatSend(t *testing.T) {
297 name: "sends chat msg transaction to all clients",
301 Access: func() accessBitmap {
302 var bits accessBitmap
303 bits.Set(accessSendChat)
307 UserName: []byte{0x00, 0x01},
309 Clients: map[uint16]*ClientConn{
312 Access: accessBitmap{255, 255, 255, 255, 255, 255, 255, 255},
318 Access: accessBitmap{255, 255, 255, 255, 255, 255, 255, 255},
327 NewField(fieldData, []byte("hai")),
333 clientID: &[]byte{0, 1},
336 Type: []byte{0, 0x6a},
337 ID: []byte{0x9a, 0xcb, 0x04, 0x42}, // Random ID from rand.Seed(1)
338 ErrorCode: []byte{0, 0, 0, 0},
340 NewField(fieldData, []byte{0x0d, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x00, 0x01, 0x3a, 0x20, 0x20, 0x68, 0x61, 0x69}),
344 clientID: &[]byte{0, 2},
347 Type: []byte{0, 0x6a},
348 ID: []byte{0xf0, 0xc5, 0x34, 0x1e}, // Random ID from rand.Seed(1)
349 ErrorCode: []byte{0, 0, 0, 0},
351 NewField(fieldData, []byte{0x0d, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x00, 0x01, 0x3a, 0x20, 0x20, 0x68, 0x61, 0x69}),
358 name: "treats Chat ID 00 00 00 00 as a public chat message",
362 Access: func() accessBitmap {
363 var bits accessBitmap
364 bits.Set(accessSendChat)
368 UserName: []byte{0x00, 0x01},
370 Clients: map[uint16]*ClientConn{
373 Access: accessBitmap{255, 255, 255, 255, 255, 255, 255, 255},
379 Access: accessBitmap{255, 255, 255, 255, 255, 255, 255, 255},
388 NewField(fieldData, []byte("hai")),
389 NewField(fieldChatID, []byte{0, 0, 0, 0}),
395 clientID: &[]byte{0, 1},
398 Type: []byte{0, 0x6a},
399 ID: []byte{0x9a, 0xcb, 0x04, 0x42}, // Random ID from rand.Seed(1)
400 ErrorCode: []byte{0, 0, 0, 0},
402 NewField(fieldData, []byte{0x0d, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x00, 0x01, 0x3a, 0x20, 0x20, 0x68, 0x61, 0x69}),
406 clientID: &[]byte{0, 2},
409 Type: []byte{0, 0x6a},
410 ID: []byte{0xf0, 0xc5, 0x34, 0x1e}, // Random ID from rand.Seed(1)
411 ErrorCode: []byte{0, 0, 0, 0},
413 NewField(fieldData, []byte{0x0d, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x00, 0x01, 0x3a, 0x20, 0x20, 0x68, 0x61, 0x69}),
420 name: "when user does not have required permission",
424 Access: func() accessBitmap {
425 var bits accessBitmap
430 Accounts: map[string]*Account{},
434 tranChatSend, &[]byte{0, 1},
435 NewField(fieldData, []byte("hai")),
443 ID: []byte{0x9a, 0xcb, 0x04, 0x42},
444 ErrorCode: []byte{0, 0, 0, 1},
446 NewField(fieldError, []byte("You are not allowed to participate in chat.")),
453 name: "sends chat msg as emote if fieldChatOptions is set to 1",
457 Access: func() accessBitmap {
458 var bits accessBitmap
459 bits.Set(accessSendChat)
463 UserName: []byte("Testy McTest"),
465 Clients: map[uint16]*ClientConn{
468 Access: accessBitmap{255, 255, 255, 255, 255, 255, 255, 255},
474 Access: accessBitmap{255, 255, 255, 255, 255, 255, 255, 255},
483 NewField(fieldData, []byte("performed action")),
484 NewField(fieldChatOptions, []byte{0x00, 0x01}),
490 clientID: &[]byte{0, 1},
493 Type: []byte{0, 0x6a},
494 ID: []byte{0x9a, 0xcb, 0x04, 0x42},
495 ErrorCode: []byte{0, 0, 0, 0},
497 NewField(fieldData, []byte("\r*** Testy McTest performed action")),
501 clientID: &[]byte{0, 2},
504 Type: []byte{0, 0x6a},
505 ID: []byte{0xf0, 0xc5, 0x34, 0x1e},
506 ErrorCode: []byte{0, 0, 0, 0},
508 NewField(fieldData, []byte("\r*** Testy McTest performed action")),
515 name: "does not send chat msg as emote if fieldChatOptions is set to 0",
519 Access: func() accessBitmap {
520 var bits accessBitmap
521 bits.Set(accessSendChat)
525 UserName: []byte("Testy McTest"),
527 Clients: map[uint16]*ClientConn{
530 Access: accessBitmap{255, 255, 255, 255, 255, 255, 255, 255},
536 Access: accessBitmap{255, 255, 255, 255, 255, 255, 255, 255},
545 NewField(fieldData, []byte("hello")),
546 NewField(fieldChatOptions, []byte{0x00, 0x00}),
552 clientID: &[]byte{0, 1},
555 Type: []byte{0, 0x6a},
556 ID: []byte{0x9a, 0xcb, 0x04, 0x42},
557 ErrorCode: []byte{0, 0, 0, 0},
559 NewField(fieldData, []byte("\r Testy McTest: hello")),
563 clientID: &[]byte{0, 2},
566 Type: []byte{0, 0x6a},
567 ID: []byte{0xf0, 0xc5, 0x34, 0x1e},
568 ErrorCode: []byte{0, 0, 0, 0},
570 NewField(fieldData, []byte("\r Testy McTest: hello")),
577 name: "only sends chat msg to clients with accessReadChat permission",
581 Access: func() accessBitmap {
582 var bits accessBitmap
583 bits.Set(accessSendChat)
587 UserName: []byte{0x00, 0x01},
589 Clients: map[uint16]*ClientConn{
592 Access: func() accessBitmap {
593 var bits accessBitmap
594 bits.Set(accessReadChat)
601 Access: accessBitmap{0, 0, 0, 0, 0, 0, 0, 0},
610 NewField(fieldData, []byte("hai")),
616 clientID: &[]byte{0, 1},
619 Type: []byte{0, 0x6a},
620 ID: []byte{0x9a, 0xcb, 0x04, 0x42}, // Random ID from rand.Seed(1)
621 ErrorCode: []byte{0, 0, 0, 0},
623 NewField(fieldData, []byte{0x0d, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x00, 0x01, 0x3a, 0x20, 0x20, 0x68, 0x61, 0x69}),
630 name: "only sends private chat msg to members of private chat",
634 Access: func() accessBitmap {
635 var bits accessBitmap
636 bits.Set(accessSendChat)
640 UserName: []byte{0x00, 0x01},
642 PrivateChats: map[uint32]*PrivateChat{
644 ClientConn: map[uint16]*ClientConn{
654 Clients: map[uint16]*ClientConn{
657 Access: accessBitmap{255, 255, 255, 255, 255, 255, 255, 255},
663 Access: accessBitmap{0, 0, 0, 0, 0, 0, 0, 0},
669 Access: accessBitmap{0, 0, 0, 0, 0, 0, 0, 0},
678 NewField(fieldData, []byte("hai")),
679 NewField(fieldChatID, []byte{0, 0, 0, 1}),
685 clientID: &[]byte{0, 1},
688 Type: []byte{0, 0x6a},
689 ID: []byte{0x9a, 0xcb, 0x04, 0x42},
690 ErrorCode: []byte{0, 0, 0, 0},
692 NewField(fieldChatID, []byte{0, 0, 0, 1}),
693 NewField(fieldData, []byte{0x0d, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x00, 0x01, 0x3a, 0x20, 0x20, 0x68, 0x61, 0x69}),
697 clientID: &[]byte{0, 2},
700 Type: []byte{0, 0x6a},
701 ID: []byte{0x9a, 0xcb, 0x04, 0x42},
702 ErrorCode: []byte{0, 0, 0, 0},
704 NewField(fieldChatID, []byte{0, 0, 0, 1}),
705 NewField(fieldData, []byte{0x0d, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x00, 0x01, 0x3a, 0x20, 0x20, 0x68, 0x61, 0x69}),
712 for _, tt := range tests {
713 t.Run(tt.name, func(t *testing.T) {
714 got, err := HandleChatSend(tt.args.cc, tt.args.t)
716 if (err != nil) != tt.wantErr {
717 t.Errorf("HandleChatSend() error = %v, wantErr %v", err, tt.wantErr)
720 tranAssertEqual(t, tt.want, got)
725 func TestHandleGetFileInfo(t *testing.T) {
726 rand.Seed(1) // reset seed between tests to make transaction IDs predictable
735 wantRes []Transaction
739 name: "returns expected fields when a valid file is requested",
742 ID: &[]byte{0x00, 0x01},
746 FileRoot: func() string {
747 path, _ := os.Getwd()
748 return filepath.Join(path, "/test/config/Files")
754 tranGetFileInfo, nil,
755 NewField(fieldFileName, []byte("testfile.txt")),
756 NewField(fieldFilePath, []byte{0x00, 0x00}),
759 wantRes: []Transaction{
761 clientID: &[]byte{0, 1},
765 ID: []byte{0x9a, 0xcb, 0x04, 0x42}, // Random ID from rand.Seed(1)
766 ErrorCode: []byte{0, 0, 0, 0},
768 NewField(fieldFileName, []byte("testfile.txt")),
769 NewField(fieldFileTypeString, []byte("Text File")),
770 NewField(fieldFileCreatorString, []byte("ttxt")),
771 NewField(fieldFileComment, []byte{}),
772 NewField(fieldFileType, []byte("TEXT")),
773 NewField(fieldFileCreateDate, make([]byte, 8)),
774 NewField(fieldFileModifyDate, make([]byte, 8)),
775 NewField(fieldFileSize, []byte{0x0, 0x0, 0x0, 0x17}),
782 for _, tt := range tests {
783 t.Run(tt.name, func(t *testing.T) {
784 rand.Seed(1) // reset seed between tests to make transaction IDs predictable
786 gotRes, err := HandleGetFileInfo(tt.args.cc, tt.args.t)
787 if (err != nil) != tt.wantErr {
788 t.Errorf("HandleGetFileInfo() error = %v, wantErr %v", err, tt.wantErr)
792 // Clear the fileWrapper timestamp fields to work around problems running the tests in multiple timezones
793 // TODO: revisit how to test this by mocking the stat calls
794 gotRes[0].Fields[5].Data = make([]byte, 8)
795 gotRes[0].Fields[6].Data = make([]byte, 8)
796 if !assert.Equal(t, tt.wantRes, gotRes) {
797 t.Errorf("HandleGetFileInfo() gotRes = %v, want %v", gotRes, tt.wantRes)
803 func TestHandleNewFolder(t *testing.T) {
811 wantRes []Transaction
815 name: "without required permission",
819 Access: func() accessBitmap {
820 var bits accessBitmap
830 wantRes: []Transaction{
835 ID: []byte{0x9a, 0xcb, 0x04, 0x42},
836 ErrorCode: []byte{0, 0, 0, 1},
838 NewField(fieldError, []byte("You are not allowed to create folders.")),
845 name: "when path is nested",
849 Access: func() accessBitmap {
850 var bits accessBitmap
851 bits.Set(accessCreateFolder)
860 FS: func() *MockFileStore {
861 mfs := &MockFileStore{}
862 mfs.On("Mkdir", "/Files/aaa/testFolder", fs.FileMode(0777)).Return(nil)
863 mfs.On("Stat", "/Files/aaa/testFolder").Return(nil, os.ErrNotExist)
869 tranNewFolder, &[]byte{0, 1},
870 NewField(fieldFileName, []byte("testFolder")),
871 NewField(fieldFilePath, []byte{
879 wantRes: []Transaction{
881 clientID: &[]byte{0, 1},
885 ID: []byte{0x9a, 0xcb, 0x04, 0x42}, // Random ID from rand.Seed(1)
886 ErrorCode: []byte{0, 0, 0, 0},
892 name: "when path is not nested",
896 Access: func() accessBitmap {
897 var bits accessBitmap
898 bits.Set(accessCreateFolder)
907 FS: func() *MockFileStore {
908 mfs := &MockFileStore{}
909 mfs.On("Mkdir", "/Files/testFolder", fs.FileMode(0777)).Return(nil)
910 mfs.On("Stat", "/Files/testFolder").Return(nil, os.ErrNotExist)
916 tranNewFolder, &[]byte{0, 1},
917 NewField(fieldFileName, []byte("testFolder")),
920 wantRes: []Transaction{
922 clientID: &[]byte{0, 1},
926 ID: []byte{0x9a, 0xcb, 0x04, 0x42}, // Random ID from rand.Seed(1)
927 ErrorCode: []byte{0, 0, 0, 0},
933 name: "when Write returns an err",
937 Access: func() accessBitmap {
938 var bits accessBitmap
939 bits.Set(accessCreateFolder)
948 FS: func() *MockFileStore {
949 mfs := &MockFileStore{}
950 mfs.On("Mkdir", "/Files/aaa/testFolder", fs.FileMode(0777)).Return(nil)
951 mfs.On("Stat", "/Files/aaa/testFolder").Return(nil, os.ErrNotExist)
957 tranNewFolder, &[]byte{0, 1},
958 NewField(fieldFileName, []byte("testFolder")),
959 NewField(fieldFilePath, []byte{
964 wantRes: []Transaction{},
968 name: "fieldFileName does not allow directory traversal",
972 Access: func() accessBitmap {
973 var bits accessBitmap
974 bits.Set(accessCreateFolder)
983 FS: func() *MockFileStore {
984 mfs := &MockFileStore{}
985 mfs.On("Mkdir", "/Files/testFolder", fs.FileMode(0777)).Return(nil)
986 mfs.On("Stat", "/Files/testFolder").Return(nil, os.ErrNotExist)
992 tranNewFolder, &[]byte{0, 1},
993 NewField(fieldFileName, []byte("../../testFolder")),
996 wantRes: []Transaction{
998 clientID: &[]byte{0, 1},
1002 ID: []byte{0x9a, 0xcb, 0x04, 0x42}, // Random ID from rand.Seed(1)
1003 ErrorCode: []byte{0, 0, 0, 0},
1008 name: "fieldFilePath does not allow directory traversal",
1012 Access: func() accessBitmap {
1013 var bits accessBitmap
1014 bits.Set(accessCreateFolder)
1021 FileRoot: "/Files/",
1023 FS: func() *MockFileStore {
1024 mfs := &MockFileStore{}
1025 mfs.On("Mkdir", "/Files/foo/testFolder", fs.FileMode(0777)).Return(nil)
1026 mfs.On("Stat", "/Files/foo/testFolder").Return(nil, os.ErrNotExist)
1032 tranNewFolder, &[]byte{0, 1},
1033 NewField(fieldFileName, []byte("testFolder")),
1034 NewField(fieldFilePath, []byte{
1045 wantRes: []Transaction{
1047 clientID: &[]byte{0, 1},
1051 ID: []byte{0x9a, 0xcb, 0x04, 0x42}, // Random ID from rand.Seed(1)
1052 ErrorCode: []byte{0, 0, 0, 0},
1057 for _, tt := range tests {
1058 t.Run(tt.name, func(t *testing.T) {
1060 gotRes, err := HandleNewFolder(tt.args.cc, tt.args.t)
1061 if (err != nil) != tt.wantErr {
1062 t.Errorf("HandleNewFolder() error = %v, wantErr %v", err, tt.wantErr)
1066 if !tranAssertEqual(t, tt.wantRes, gotRes) {
1067 t.Errorf("HandleNewFolder() gotRes = %v, want %v", gotRes, tt.wantRes)
1073 func TestHandleUploadFile(t *testing.T) {
1081 wantRes []Transaction
1085 name: "when request is valid and user has Upload Anywhere permission",
1090 fileTransfers: map[[4]byte]*FileTransfer{},
1092 FileRoot: func() string { path, _ := os.Getwd(); return path + "/test/config/Files" }(),
1094 transfers: map[int]map[[4]byte]*FileTransfer{
1098 Access: func() accessBitmap {
1099 var bits accessBitmap
1100 bits.Set(accessUploadFile)
1101 bits.Set(accessUploadAnywhere)
1107 tranUploadFile, &[]byte{0, 1},
1108 NewField(fieldFileName, []byte("testFile")),
1109 NewField(fieldFilePath, []byte{
1117 wantRes: []Transaction{
1122 ID: []byte{0x9a, 0xcb, 0x04, 0x42},
1123 ErrorCode: []byte{0, 0, 0, 0},
1125 NewField(fieldRefNum, []byte{0x52, 0xfd, 0xfc, 0x07}), // rand.Seed(1)
1132 name: "when user does not have required access",
1136 Access: func() accessBitmap {
1137 var bits accessBitmap
1143 tranUploadFile, &[]byte{0, 1},
1144 NewField(fieldFileName, []byte("testFile")),
1145 NewField(fieldFilePath, []byte{
1153 wantRes: []Transaction{
1158 ID: []byte{0x9a, 0xcb, 0x04, 0x42},
1159 ErrorCode: []byte{0, 0, 0, 1},
1161 NewField(fieldError, []byte("You are not allowed to upload files.")), // rand.Seed(1)
1168 for _, tt := range tests {
1169 t.Run(tt.name, func(t *testing.T) {
1171 gotRes, err := HandleUploadFile(tt.args.cc, tt.args.t)
1172 if (err != nil) != tt.wantErr {
1173 t.Errorf("HandleUploadFile() error = %v, wantErr %v", err, tt.wantErr)
1177 tranAssertEqual(t, tt.wantRes, gotRes)
1183 func TestHandleMakeAlias(t *testing.T) {
1191 wantRes []Transaction
1195 name: "with valid input and required permissions",
1198 logger: NewTestLogger(),
1200 Access: func() accessBitmap {
1201 var bits accessBitmap
1202 bits.Set(accessMakeAlias)
1208 FileRoot: func() string {
1209 path, _ := os.Getwd()
1210 return path + "/test/config/Files"
1213 Logger: NewTestLogger(),
1214 FS: func() *MockFileStore {
1215 mfs := &MockFileStore{}
1216 path, _ := os.Getwd()
1219 path+"/test/config/Files/foo/testFile",
1220 path+"/test/config/Files/bar/testFile",
1227 tranMakeFileAlias, &[]byte{0, 1},
1228 NewField(fieldFileName, []byte("testFile")),
1229 NewField(fieldFilePath, EncodeFilePath(strings.Join([]string{"foo"}, "/"))),
1230 NewField(fieldFileNewPath, EncodeFilePath(strings.Join([]string{"bar"}, "/"))),
1233 wantRes: []Transaction{
1238 ID: []byte{0x9a, 0xcb, 0x04, 0x42},
1239 ErrorCode: []byte{0, 0, 0, 0},
1240 Fields: []Field(nil),
1246 name: "when symlink returns an error",
1249 logger: NewTestLogger(),
1251 Access: func() accessBitmap {
1252 var bits accessBitmap
1253 bits.Set(accessMakeAlias)
1259 FileRoot: func() string {
1260 path, _ := os.Getwd()
1261 return path + "/test/config/Files"
1264 Logger: NewTestLogger(),
1265 FS: func() *MockFileStore {
1266 mfs := &MockFileStore{}
1267 path, _ := os.Getwd()
1270 path+"/test/config/Files/foo/testFile",
1271 path+"/test/config/Files/bar/testFile",
1272 ).Return(errors.New("ohno"))
1278 tranMakeFileAlias, &[]byte{0, 1},
1279 NewField(fieldFileName, []byte("testFile")),
1280 NewField(fieldFilePath, EncodeFilePath(strings.Join([]string{"foo"}, "/"))),
1281 NewField(fieldFileNewPath, EncodeFilePath(strings.Join([]string{"bar"}, "/"))),
1284 wantRes: []Transaction{
1289 ID: []byte{0x9a, 0xcb, 0x04, 0x42},
1290 ErrorCode: []byte{0, 0, 0, 1},
1292 NewField(fieldError, []byte("Error creating alias")),
1299 name: "when user does not have required permission",
1302 logger: NewTestLogger(),
1304 Access: func() accessBitmap {
1305 var bits accessBitmap
1311 FileRoot: func() string {
1312 path, _ := os.Getwd()
1313 return path + "/test/config/Files"
1319 tranMakeFileAlias, &[]byte{0, 1},
1320 NewField(fieldFileName, []byte("testFile")),
1321 NewField(fieldFilePath, []byte{
1327 NewField(fieldFileNewPath, []byte{
1335 wantRes: []Transaction{
1340 ID: []byte{0x9a, 0xcb, 0x04, 0x42},
1341 ErrorCode: []byte{0, 0, 0, 1},
1343 NewField(fieldError, []byte("You are not allowed to make aliases.")),
1350 for _, tt := range tests {
1351 t.Run(tt.name, func(t *testing.T) {
1352 gotRes, err := HandleMakeAlias(tt.args.cc, tt.args.t)
1353 if (err != nil) != tt.wantErr {
1354 t.Errorf("HandleMakeAlias(%v, %v)", tt.args.cc, tt.args.t)
1358 tranAssertEqual(t, tt.wantRes, gotRes)
1363 func TestHandleGetUser(t *testing.T) {
1371 wantRes []Transaction
1372 wantErr assert.ErrorAssertionFunc
1375 name: "when account is valid",
1379 Access: func() accessBitmap {
1380 var bits accessBitmap
1381 bits.Set(accessOpenUser)
1386 Accounts: map[string]*Account{
1390 Password: "password",
1391 Access: accessBitmap{},
1397 tranGetUser, &[]byte{0, 1},
1398 NewField(fieldUserLogin, []byte("guest")),
1401 wantRes: []Transaction{
1406 ID: []byte{0x9a, 0xcb, 0x04, 0x42},
1407 ErrorCode: []byte{0, 0, 0, 0},
1409 NewField(fieldUserName, []byte("Guest")),
1410 NewField(fieldUserLogin, negateString([]byte("guest"))),
1411 NewField(fieldUserPassword, []byte("password")),
1412 NewField(fieldUserAccess, []byte{0, 0, 0, 0, 0, 0, 0, 0}),
1416 wantErr: assert.NoError,
1419 name: "when user does not have required permission",
1423 Access: func() accessBitmap {
1424 var bits accessBitmap
1429 Accounts: map[string]*Account{},
1433 tranGetUser, &[]byte{0, 1},
1434 NewField(fieldUserLogin, []byte("nonExistentUser")),
1437 wantRes: []Transaction{
1442 ID: []byte{0x9a, 0xcb, 0x04, 0x42},
1443 ErrorCode: []byte{0, 0, 0, 1},
1445 NewField(fieldError, []byte("You are not allowed to view accounts.")),
1449 wantErr: assert.NoError,
1452 name: "when account does not exist",
1456 Access: func() accessBitmap {
1457 var bits accessBitmap
1458 bits.Set(accessOpenUser)
1463 Accounts: map[string]*Account{},
1467 tranGetUser, &[]byte{0, 1},
1468 NewField(fieldUserLogin, []byte("nonExistentUser")),
1471 wantRes: []Transaction{
1476 ID: []byte{0x9a, 0xcb, 0x04, 0x42},
1477 ErrorCode: []byte{0, 0, 0, 1},
1479 NewField(fieldError, []byte("Account does not exist.")),
1483 wantErr: assert.NoError,
1486 for _, tt := range tests {
1487 t.Run(tt.name, func(t *testing.T) {
1488 gotRes, err := HandleGetUser(tt.args.cc, tt.args.t)
1489 if !tt.wantErr(t, err, fmt.Sprintf("HandleGetUser(%v, %v)", tt.args.cc, tt.args.t)) {
1493 tranAssertEqual(t, tt.wantRes, gotRes)
1498 func TestHandleDeleteUser(t *testing.T) {
1506 wantRes []Transaction
1507 wantErr assert.ErrorAssertionFunc
1510 name: "when user dataFile",
1514 Access: func() accessBitmap {
1515 var bits accessBitmap
1516 bits.Set(accessDeleteUser)
1521 Accounts: map[string]*Account{
1524 Name: "Testy McTest",
1525 Password: "password",
1526 Access: accessBitmap{},
1529 FS: func() *MockFileStore {
1530 mfs := &MockFileStore{}
1531 mfs.On("Remove", "Users/testuser.yaml").Return(nil)
1537 tranDeleteUser, &[]byte{0, 1},
1538 NewField(fieldUserLogin, negateString([]byte("testuser"))),
1541 wantRes: []Transaction{
1546 ID: []byte{0x9a, 0xcb, 0x04, 0x42},
1547 ErrorCode: []byte{0, 0, 0, 0},
1548 Fields: []Field(nil),
1551 wantErr: assert.NoError,
1554 name: "when user does not have required permission",
1558 Access: func() accessBitmap {
1559 var bits accessBitmap
1564 Accounts: map[string]*Account{},
1568 tranDeleteUser, &[]byte{0, 1},
1569 NewField(fieldUserLogin, negateString([]byte("testuser"))),
1572 wantRes: []Transaction{
1577 ID: []byte{0x9a, 0xcb, 0x04, 0x42},
1578 ErrorCode: []byte{0, 0, 0, 1},
1580 NewField(fieldError, []byte("You are not allowed to delete accounts.")),
1584 wantErr: assert.NoError,
1587 for _, tt := range tests {
1588 t.Run(tt.name, func(t *testing.T) {
1589 gotRes, err := HandleDeleteUser(tt.args.cc, tt.args.t)
1590 if !tt.wantErr(t, err, fmt.Sprintf("HandleDeleteUser(%v, %v)", tt.args.cc, tt.args.t)) {
1594 tranAssertEqual(t, tt.wantRes, gotRes)
1599 func TestHandleGetMsgs(t *testing.T) {
1607 wantRes []Transaction
1608 wantErr assert.ErrorAssertionFunc
1611 name: "returns news data",
1615 Access: func() accessBitmap {
1616 var bits accessBitmap
1617 bits.Set(accessNewsReadArt)
1622 FlatNews: []byte("TEST"),
1626 tranGetMsgs, &[]byte{0, 1},
1629 wantRes: []Transaction{
1634 ID: []byte{0x9a, 0xcb, 0x04, 0x42},
1635 ErrorCode: []byte{0, 0, 0, 0},
1637 NewField(fieldData, []byte("TEST")),
1641 wantErr: assert.NoError,
1644 name: "when user does not have required permission",
1648 Access: func() accessBitmap {
1649 var bits accessBitmap
1654 Accounts: map[string]*Account{},
1658 tranGetMsgs, &[]byte{0, 1},
1661 wantRes: []Transaction{
1666 ID: []byte{0x9a, 0xcb, 0x04, 0x42},
1667 ErrorCode: []byte{0, 0, 0, 1},
1669 NewField(fieldError, []byte("You are not allowed to read news.")),
1673 wantErr: assert.NoError,
1676 for _, tt := range tests {
1677 t.Run(tt.name, func(t *testing.T) {
1678 gotRes, err := HandleGetMsgs(tt.args.cc, tt.args.t)
1679 if !tt.wantErr(t, err, fmt.Sprintf("HandleGetMsgs(%v, %v)", tt.args.cc, tt.args.t)) {
1683 tranAssertEqual(t, tt.wantRes, gotRes)
1688 func TestHandleNewUser(t *testing.T) {
1696 wantRes []Transaction
1697 wantErr assert.ErrorAssertionFunc
1700 name: "when user does not have required permission",
1704 Access: func() accessBitmap {
1705 var bits accessBitmap
1710 Accounts: map[string]*Account{},
1714 tranNewUser, &[]byte{0, 1},
1717 wantRes: []Transaction{
1722 ID: []byte{0x9a, 0xcb, 0x04, 0x42},
1723 ErrorCode: []byte{0, 0, 0, 1},
1725 NewField(fieldError, []byte("You are not allowed to create new accounts.")),
1729 wantErr: assert.NoError,
1732 name: "when user attempts to create account with greater access",
1736 Access: func() accessBitmap {
1737 var bits accessBitmap
1738 bits.Set(accessCreateUser)
1743 Accounts: map[string]*Account{},
1747 tranNewUser, &[]byte{0, 1},
1748 NewField(fieldUserLogin, []byte("userB")),
1752 var bits accessBitmap
1753 bits.Set(accessDisconUser)
1759 wantRes: []Transaction{
1764 ID: []byte{0x9a, 0xcb, 0x04, 0x42},
1765 ErrorCode: []byte{0, 0, 0, 1},
1767 NewField(fieldError, []byte("Cannot create account with more access than yourself.")),
1771 wantErr: assert.NoError,
1774 for _, tt := range tests {
1775 t.Run(tt.name, func(t *testing.T) {
1776 gotRes, err := HandleNewUser(tt.args.cc, tt.args.t)
1777 if !tt.wantErr(t, err, fmt.Sprintf("HandleNewUser(%v, %v)", tt.args.cc, tt.args.t)) {
1781 tranAssertEqual(t, tt.wantRes, gotRes)
1786 func TestHandleListUsers(t *testing.T) {
1794 wantRes []Transaction
1795 wantErr assert.ErrorAssertionFunc
1798 name: "when user does not have required permission",
1802 Access: func() accessBitmap {
1803 var bits accessBitmap
1808 Accounts: map[string]*Account{},
1812 tranNewUser, &[]byte{0, 1},
1815 wantRes: []Transaction{
1820 ID: []byte{0x9a, 0xcb, 0x04, 0x42},
1821 ErrorCode: []byte{0, 0, 0, 1},
1823 NewField(fieldError, []byte("You are not allowed to view accounts.")),
1827 wantErr: assert.NoError,
1830 name: "when user has required permission",
1834 Access: func() accessBitmap {
1835 var bits accessBitmap
1836 bits.Set(accessOpenUser)
1841 Accounts: map[string]*Account{
1846 Access: accessBitmap{255, 255, 255, 255, 255, 255, 255, 255},
1852 tranGetClientInfoText, &[]byte{0, 1},
1853 NewField(fieldUserID, []byte{0, 1}),
1856 wantRes: []Transaction{
1861 ID: []byte{0, 0, 0, 0},
1862 ErrorCode: []byte{0, 0, 0, 0},
1864 NewField(fieldData, []byte{
1865 0x00, 0x04, 0x00, 0x66, 0x00, 0x05, 0x67, 0x75, 0x65, 0x73, 0x74, 0x00, 0x69, 0x00, 0x05, 0x98,
1866 0x8a, 0x9a, 0x8c, 0x8b, 0x00, 0x6e, 0x00, 0x08, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
1867 0x00, 0x6a, 0x00, 0x01, 0x78,
1872 wantErr: assert.NoError,
1875 for _, tt := range tests {
1876 t.Run(tt.name, func(t *testing.T) {
1877 gotRes, err := HandleListUsers(tt.args.cc, tt.args.t)
1878 if !tt.wantErr(t, err, fmt.Sprintf("HandleListUsers(%v, %v)", tt.args.cc, tt.args.t)) {
1882 tranAssertEqual(t, tt.wantRes, gotRes)
1887 func TestHandleDownloadFile(t *testing.T) {
1895 wantRes []Transaction
1896 wantErr assert.ErrorAssertionFunc
1899 name: "when user does not have required permission",
1903 Access: func() accessBitmap {
1904 var bits accessBitmap
1910 t: NewTransaction(tranDownloadFile, &[]byte{0, 1}),
1912 wantRes: []Transaction{
1917 ID: []byte{0x9a, 0xcb, 0x04, 0x42},
1918 ErrorCode: []byte{0, 0, 0, 1},
1920 NewField(fieldError, []byte("You are not allowed to download files.")),
1924 wantErr: assert.NoError,
1927 name: "with a valid file",
1930 transfers: map[int]map[[4]byte]*FileTransfer{
1934 Access: func() accessBitmap {
1935 var bits accessBitmap
1936 bits.Set(accessDownloadFile)
1942 fileTransfers: map[[4]byte]*FileTransfer{},
1944 FileRoot: func() string { path, _ := os.Getwd(); return path + "/test/config/Files" }(),
1946 Accounts: map[string]*Account{},
1952 NewField(fieldFileName, []byte("testfile.txt")),
1953 NewField(fieldFilePath, []byte{0x0, 0x00}),
1956 wantRes: []Transaction{
1961 ID: []byte{0x9a, 0xcb, 0x04, 0x42},
1962 ErrorCode: []byte{0, 0, 0, 0},
1964 NewField(fieldRefNum, []byte{0x52, 0xfd, 0xfc, 0x07}),
1965 NewField(fieldWaitingCount, []byte{0x00, 0x00}),
1966 NewField(fieldTransferSize, []byte{0x00, 0x00, 0x00, 0xa5}),
1967 NewField(fieldFileSize, []byte{0x00, 0x00, 0x00, 0x17}),
1971 wantErr: assert.NoError,
1974 name: "when client requests to resume 1k test file at offset 256",
1977 transfers: map[int]map[[4]byte]*FileTransfer{
1979 }, Account: &Account{
1980 Access: func() accessBitmap {
1981 var bits accessBitmap
1982 bits.Set(accessDownloadFile)
1989 // FS: func() *MockFileStore {
1990 // path, _ := os.Getwd()
1991 // testFile, err := os.Open(path + "/test/config/Files/testfile-1k")
1996 // mfi := &MockFileInfo{}
1997 // mfi.On("Mode").Return(fs.FileMode(0))
1998 // mfs := &MockFileStore{}
1999 // mfs.On("Stat", "/fakeRoot/Files/testfile.txt").Return(mfi, nil)
2000 // mfs.On("Open", "/fakeRoot/Files/testfile.txt").Return(testFile, nil)
2001 // mfs.On("Stat", "/fakeRoot/Files/.info_testfile.txt").Return(nil, errors.New("no"))
2002 // mfs.On("Stat", "/fakeRoot/Files/.rsrc_testfile.txt").Return(nil, errors.New("no"))
2006 fileTransfers: map[[4]byte]*FileTransfer{},
2008 FileRoot: func() string { path, _ := os.Getwd(); return path + "/test/config/Files" }(),
2010 Accounts: map[string]*Account{},
2016 NewField(fieldFileName, []byte("testfile-1k")),
2017 NewField(fieldFilePath, []byte{0x00, 0x00}),
2019 fieldFileResumeData,
2021 frd := FileResumeData{
2025 ForkCount: [2]byte{0, 2},
2026 ForkInfoList: []ForkInfoList{
2028 Fork: [4]byte{0x44, 0x41, 0x54, 0x41}, // "DATA"
2029 DataSize: [4]byte{0, 0, 0x01, 0x00}, // request offset 256
2034 Fork: [4]byte{0x4d, 0x41, 0x43, 0x52}, // "MACR"
2035 DataSize: [4]byte{0, 0, 0, 0},
2041 b, _ := frd.BinaryMarshal()
2047 wantRes: []Transaction{
2052 ID: []byte{0x9a, 0xcb, 0x04, 0x42},
2053 ErrorCode: []byte{0, 0, 0, 0},
2055 NewField(fieldRefNum, []byte{0x52, 0xfd, 0xfc, 0x07}),
2056 NewField(fieldWaitingCount, []byte{0x00, 0x00}),
2057 NewField(fieldTransferSize, []byte{0x00, 0x00, 0x03, 0x8d}),
2058 NewField(fieldFileSize, []byte{0x00, 0x00, 0x03, 0x00}),
2062 wantErr: assert.NoError,
2065 for _, tt := range tests {
2066 t.Run(tt.name, func(t *testing.T) {
2067 gotRes, err := HandleDownloadFile(tt.args.cc, tt.args.t)
2068 if !tt.wantErr(t, err, fmt.Sprintf("HandleDownloadFile(%v, %v)", tt.args.cc, tt.args.t)) {
2072 tranAssertEqual(t, tt.wantRes, gotRes)
2077 func TestHandleUpdateUser(t *testing.T) {
2085 wantRes []Transaction
2086 wantErr assert.ErrorAssertionFunc
2089 name: "when action is create user without required permission",
2092 logger: NewTestLogger(),
2094 Logger: NewTestLogger(),
2097 Access: func() accessBitmap {
2098 var bits accessBitmap
2106 NewField(fieldData, []byte{
2107 0x00, 0x04, // field count
2109 0x00, 0x69, // fieldUserLogin = 105
2113 0x00, 0x6a, // fieldUserPassword = 106
2117 0x00, 0x66, // fieldUserName = 102
2121 0x00, 0x6e, // fieldUserAccess = 110
2123 0x60, 0x70, 0x0c, 0x20, 0x03, 0x80, 0x00, 0x00,
2127 wantRes: []Transaction{
2132 ID: []byte{0x9a, 0xcb, 0x04, 0x42},
2133 ErrorCode: []byte{0, 0, 0, 1},
2135 NewField(fieldError, []byte("You are not allowed to create new accounts.")),
2139 wantErr: assert.NoError,
2142 name: "when action is modify user without required permission",
2145 logger: NewTestLogger(),
2147 Logger: NewTestLogger(),
2148 Accounts: map[string]*Account{
2153 Access: func() accessBitmap {
2154 var bits accessBitmap
2162 NewField(fieldData, []byte{
2163 0x00, 0x04, // field count
2165 0x00, 0x69, // fieldUserLogin = 105
2169 0x00, 0x6a, // fieldUserPassword = 106
2173 0x00, 0x66, // fieldUserName = 102
2177 0x00, 0x6e, // fieldUserAccess = 110
2179 0x60, 0x70, 0x0c, 0x20, 0x03, 0x80, 0x00, 0x00,
2183 wantRes: []Transaction{
2188 ID: []byte{0x9a, 0xcb, 0x04, 0x42},
2189 ErrorCode: []byte{0, 0, 0, 1},
2191 NewField(fieldError, []byte("You are not allowed to modify accounts.")),
2195 wantErr: assert.NoError,
2198 name: "when action is delete user without required permission",
2201 logger: NewTestLogger(),
2203 Accounts: map[string]*Account{
2208 Access: func() accessBitmap {
2209 var bits accessBitmap
2217 NewField(fieldData, []byte{
2225 wantRes: []Transaction{
2230 ID: []byte{0x9a, 0xcb, 0x04, 0x42},
2231 ErrorCode: []byte{0, 0, 0, 1},
2233 NewField(fieldError, []byte("You are not allowed to delete accounts.")),
2237 wantErr: assert.NoError,
2240 for _, tt := range tests {
2241 t.Run(tt.name, func(t *testing.T) {
2242 gotRes, err := HandleUpdateUser(tt.args.cc, tt.args.t)
2243 if !tt.wantErr(t, err, fmt.Sprintf("HandleUpdateUser(%v, %v)", tt.args.cc, tt.args.t)) {
2247 tranAssertEqual(t, tt.wantRes, gotRes)
2252 func TestHandleDelNewsArt(t *testing.T) {
2260 wantRes []Transaction
2261 wantErr assert.ErrorAssertionFunc
2264 name: "without required permission",
2268 Access: func() accessBitmap {
2269 var bits accessBitmap
2279 wantRes: []Transaction{
2284 ID: []byte{0x9a, 0xcb, 0x04, 0x42},
2285 ErrorCode: []byte{0, 0, 0, 1},
2287 NewField(fieldError, []byte("You are not allowed to delete news articles.")),
2291 wantErr: assert.NoError,
2294 for _, tt := range tests {
2295 t.Run(tt.name, func(t *testing.T) {
2296 gotRes, err := HandleDelNewsArt(tt.args.cc, tt.args.t)
2297 if !tt.wantErr(t, err, fmt.Sprintf("HandleDelNewsArt(%v, %v)", tt.args.cc, tt.args.t)) {
2300 tranAssertEqual(t, tt.wantRes, gotRes)
2305 func TestHandleDisconnectUser(t *testing.T) {
2313 wantRes []Transaction
2314 wantErr assert.ErrorAssertionFunc
2317 name: "without required permission",
2321 Access: func() accessBitmap {
2322 var bits accessBitmap
2332 wantRes: []Transaction{
2337 ID: []byte{0x9a, 0xcb, 0x04, 0x42},
2338 ErrorCode: []byte{0, 0, 0, 1},
2340 NewField(fieldError, []byte("You are not allowed to disconnect users.")),
2344 wantErr: assert.NoError,
2347 name: "when target user has 'cannot be disconnected' priv",
2351 Clients: map[uint16]*ClientConn{
2355 Access: func() accessBitmap {
2356 var bits accessBitmap
2357 bits.Set(accessCannotBeDiscon)
2365 Access: func() accessBitmap {
2366 var bits accessBitmap
2367 bits.Set(accessDisconUser)
2375 NewField(fieldUserID, []byte{0, 1}),
2378 wantRes: []Transaction{
2383 ID: []byte{0x9a, 0xcb, 0x04, 0x42},
2384 ErrorCode: []byte{0, 0, 0, 1},
2386 NewField(fieldError, []byte("unnamed is not allowed to be disconnected.")),
2390 wantErr: assert.NoError,
2393 for _, tt := range tests {
2394 t.Run(tt.name, func(t *testing.T) {
2395 gotRes, err := HandleDisconnectUser(tt.args.cc, tt.args.t)
2396 if !tt.wantErr(t, err, fmt.Sprintf("HandleDisconnectUser(%v, %v)", tt.args.cc, tt.args.t)) {
2399 tranAssertEqual(t, tt.wantRes, gotRes)
2404 func TestHandleSendInstantMsg(t *testing.T) {
2412 wantRes []Transaction
2413 wantErr assert.ErrorAssertionFunc
2416 name: "without required permission",
2420 Access: func() accessBitmap {
2421 var bits accessBitmap
2431 wantRes: []Transaction{
2436 ID: []byte{0, 0, 0, 0},
2437 ErrorCode: []byte{0, 0, 0, 1},
2439 NewField(fieldError, []byte("You are not allowed to send private messages.")),
2443 wantErr: assert.NoError,
2446 name: "when client 1 sends a message to client 2",
2450 Access: func() accessBitmap {
2451 var bits accessBitmap
2452 bits.Set(accessSendPrivMsg)
2457 UserName: []byte("User1"),
2459 Clients: map[uint16]*ClientConn{
2461 AutoReply: []byte(nil),
2462 Flags: []byte{0, 0},
2470 NewField(fieldData, []byte("hai")),
2471 NewField(fieldUserID, []byte{0, 2}),
2474 wantRes: []Transaction{
2478 NewField(fieldData, []byte("hai")),
2479 NewField(fieldUserName, []byte("User1")),
2480 NewField(fieldUserID, []byte{0, 1}),
2481 NewField(fieldOptions, []byte{0, 1}),
2484 clientID: &[]byte{0, 1},
2488 ID: []byte{0, 0, 0, 0},
2489 ErrorCode: []byte{0, 0, 0, 0},
2490 Fields: []Field(nil),
2493 wantErr: assert.NoError,
2496 name: "when client 2 has autoreply enabled",
2500 Access: func() accessBitmap {
2501 var bits accessBitmap
2502 bits.Set(accessSendPrivMsg)
2507 UserName: []byte("User1"),
2509 Clients: map[uint16]*ClientConn{
2511 Flags: []byte{0, 0},
2513 UserName: []byte("User2"),
2514 AutoReply: []byte("autohai"),
2522 NewField(fieldData, []byte("hai")),
2523 NewField(fieldUserID, []byte{0, 2}),
2526 wantRes: []Transaction{
2530 NewField(fieldData, []byte("hai")),
2531 NewField(fieldUserName, []byte("User1")),
2532 NewField(fieldUserID, []byte{0, 1}),
2533 NewField(fieldOptions, []byte{0, 1}),
2538 NewField(fieldData, []byte("autohai")),
2539 NewField(fieldUserName, []byte("User2")),
2540 NewField(fieldUserID, []byte{0, 2}),
2541 NewField(fieldOptions, []byte{0, 1}),
2544 clientID: &[]byte{0, 1},
2548 ID: []byte{0, 0, 0, 0},
2549 ErrorCode: []byte{0, 0, 0, 0},
2550 Fields: []Field(nil),
2553 wantErr: assert.NoError,
2556 name: "when client 2 has refuse private messages enabled",
2560 Access: func() accessBitmap {
2561 var bits accessBitmap
2562 bits.Set(accessSendPrivMsg)
2567 UserName: []byte("User1"),
2569 Clients: map[uint16]*ClientConn{
2571 Flags: []byte{255, 255},
2573 UserName: []byte("User2"),
2581 NewField(fieldData, []byte("hai")),
2582 NewField(fieldUserID, []byte{0, 2}),
2585 wantRes: []Transaction{
2589 NewField(fieldData, []byte("User2 does not accept private messages.")),
2590 NewField(fieldUserName, []byte("User2")),
2591 NewField(fieldUserID, []byte{0, 2}),
2592 NewField(fieldOptions, []byte{0, 2}),
2595 clientID: &[]byte{0, 1},
2599 ID: []byte{0, 0, 0, 0},
2600 ErrorCode: []byte{0, 0, 0, 0},
2601 Fields: []Field(nil),
2604 wantErr: assert.NoError,
2607 for _, tt := range tests {
2608 t.Run(tt.name, func(t *testing.T) {
2609 gotRes, err := HandleSendInstantMsg(tt.args.cc, tt.args.t)
2610 if !tt.wantErr(t, err, fmt.Sprintf("HandleSendInstantMsg(%v, %v)", tt.args.cc, tt.args.t)) {
2614 tranAssertEqual(t, tt.wantRes, gotRes)
2619 func TestHandleDeleteFile(t *testing.T) {
2627 wantRes []Transaction
2628 wantErr assert.ErrorAssertionFunc
2631 name: "when user does not have required permission to delete a folder",
2635 Access: func() accessBitmap {
2636 var bits accessBitmap
2642 FileRoot: func() string {
2643 return "/fakeRoot/Files"
2646 FS: func() *MockFileStore {
2647 mfi := &MockFileInfo{}
2648 mfi.On("Mode").Return(fs.FileMode(0))
2649 mfi.On("Size").Return(int64(100))
2650 mfi.On("ModTime").Return(time.Parse(time.Layout, time.Layout))
2651 mfi.On("IsDir").Return(false)
2652 mfi.On("Name").Return("testfile")
2654 mfs := &MockFileStore{}
2655 mfs.On("Stat", "/fakeRoot/Files/aaa/testfile").Return(mfi, nil)
2656 mfs.On("Stat", "/fakeRoot/Files/aaa/.info_testfile").Return(nil, errors.New("err"))
2657 mfs.On("Stat", "/fakeRoot/Files/aaa/.rsrc_testfile").Return(nil, errors.New("err"))
2661 Accounts: map[string]*Account{},
2665 tranDeleteFile, &[]byte{0, 1},
2666 NewField(fieldFileName, []byte("testfile")),
2667 NewField(fieldFilePath, []byte{
2675 wantRes: []Transaction{
2680 ID: []byte{0x9a, 0xcb, 0x04, 0x42},
2681 ErrorCode: []byte{0, 0, 0, 1},
2683 NewField(fieldError, []byte("You are not allowed to delete files.")),
2687 wantErr: assert.NoError,
2690 name: "deletes all associated metadata files",
2694 Access: func() accessBitmap {
2695 var bits accessBitmap
2696 bits.Set(accessDeleteFile)
2702 FileRoot: func() string {
2703 return "/fakeRoot/Files"
2706 FS: func() *MockFileStore {
2707 mfi := &MockFileInfo{}
2708 mfi.On("Mode").Return(fs.FileMode(0))
2709 mfi.On("Size").Return(int64(100))
2710 mfi.On("ModTime").Return(time.Parse(time.Layout, time.Layout))
2711 mfi.On("IsDir").Return(false)
2712 mfi.On("Name").Return("testfile")
2714 mfs := &MockFileStore{}
2715 mfs.On("Stat", "/fakeRoot/Files/aaa/testfile").Return(mfi, nil)
2716 mfs.On("Stat", "/fakeRoot/Files/aaa/.info_testfile").Return(nil, errors.New("err"))
2717 mfs.On("Stat", "/fakeRoot/Files/aaa/.rsrc_testfile").Return(nil, errors.New("err"))
2719 mfs.On("RemoveAll", "/fakeRoot/Files/aaa/testfile").Return(nil)
2720 mfs.On("Remove", "/fakeRoot/Files/aaa/testfile.incomplete").Return(nil)
2721 mfs.On("Remove", "/fakeRoot/Files/aaa/.rsrc_testfile").Return(nil)
2722 mfs.On("Remove", "/fakeRoot/Files/aaa/.info_testfile").Return(nil)
2726 Accounts: map[string]*Account{},
2730 tranDeleteFile, &[]byte{0, 1},
2731 NewField(fieldFileName, []byte("testfile")),
2732 NewField(fieldFilePath, []byte{
2740 wantRes: []Transaction{
2745 ID: []byte{0x0, 0x0, 0x0, 0x0},
2746 ErrorCode: []byte{0, 0, 0, 0},
2747 Fields: []Field(nil),
2750 wantErr: assert.NoError,
2753 for _, tt := range tests {
2754 t.Run(tt.name, func(t *testing.T) {
2755 gotRes, err := HandleDeleteFile(tt.args.cc, tt.args.t)
2756 if !tt.wantErr(t, err, fmt.Sprintf("HandleDeleteFile(%v, %v)", tt.args.cc, tt.args.t)) {
2760 tranAssertEqual(t, tt.wantRes, gotRes)
2762 tt.args.cc.Server.FS.(*MockFileStore).AssertExpectations(t)
2767 func TestHandleGetFileNameList(t *testing.T) {
2775 wantRes []Transaction
2776 wantErr assert.ErrorAssertionFunc
2779 name: "when fieldFilePath is a drop box, but user does not have accessViewDropBoxes ",
2783 Access: func() accessBitmap {
2784 var bits accessBitmap
2791 FileRoot: func() string {
2792 path, _ := os.Getwd()
2793 return filepath.Join(path, "/test/config/Files/getFileNameListTestDir")
2799 tranGetFileNameList, &[]byte{0, 1},
2800 NewField(fieldFilePath, []byte{
2804 0x64, 0x72, 0x6f, 0x70, 0x20, 0x62, 0x6f, 0x78, // "drop box"
2808 wantRes: []Transaction{
2813 ID: []byte{0, 0, 0, 0},
2814 ErrorCode: []byte{0, 0, 0, 1},
2816 NewField(fieldError, []byte("You are not allowed to view drop boxes.")),
2820 wantErr: assert.NoError,
2823 name: "with file root",
2828 FileRoot: func() string {
2829 path, _ := os.Getwd()
2830 return filepath.Join(path, "/test/config/Files/getFileNameListTestDir")
2836 tranGetFileNameList, &[]byte{0, 1},
2837 NewField(fieldFilePath, []byte{
2843 wantRes: []Transaction{
2848 ID: []byte{0, 0, 0, 0},
2849 ErrorCode: []byte{0, 0, 0, 0},
2852 fieldFileNameWithInfo,
2854 fnwi := FileNameWithInfo{
2855 fileNameWithInfoHeader: fileNameWithInfoHeader{
2856 Type: [4]byte{0x54, 0x45, 0x58, 0x54},
2857 Creator: [4]byte{0x54, 0x54, 0x58, 0x54},
2858 FileSize: [4]byte{0, 0, 0x04, 0},
2860 NameScript: [2]byte{},
2861 NameSize: [2]byte{0, 0x0b},
2863 name: []byte("testfile-1k"),
2865 b, _ := fnwi.MarshalBinary()
2872 wantErr: assert.NoError,
2875 for _, tt := range tests {
2876 t.Run(tt.name, func(t *testing.T) {
2877 gotRes, err := HandleGetFileNameList(tt.args.cc, tt.args.t)
2878 if !tt.wantErr(t, err, fmt.Sprintf("HandleGetFileNameList(%v, %v)", tt.args.cc, tt.args.t)) {
2882 tranAssertEqual(t, tt.wantRes, gotRes)
2887 func TestHandleGetClientInfoText(t *testing.T) {
2895 wantRes []Transaction
2896 wantErr assert.ErrorAssertionFunc
2899 name: "when user does not have required permission",
2903 Access: func() accessBitmap {
2904 var bits accessBitmap
2909 Accounts: map[string]*Account{},
2913 tranGetClientInfoText, &[]byte{0, 1},
2914 NewField(fieldUserID, []byte{0, 1}),
2917 wantRes: []Transaction{
2922 ID: []byte{0, 0, 0, 0},
2923 ErrorCode: []byte{0, 0, 0, 1},
2925 NewField(fieldError, []byte("You are not allowed to get client info.")),
2929 wantErr: assert.NoError,
2932 name: "with a valid user",
2935 UserName: []byte("Testy McTest"),
2936 RemoteAddr: "1.2.3.4:12345",
2938 Access: func() accessBitmap {
2939 var bits accessBitmap
2940 bits.Set(accessGetClientInfo)
2947 Accounts: map[string]*Account{},
2948 Clients: map[uint16]*ClientConn{
2950 UserName: []byte("Testy McTest"),
2951 RemoteAddr: "1.2.3.4:12345",
2953 Access: func() accessBitmap {
2954 var bits accessBitmap
2955 bits.Set(accessGetClientInfo)
2964 transfers: map[int]map[[4]byte]*FileTransfer{
2972 tranGetClientInfoText, &[]byte{0, 1},
2973 NewField(fieldUserID, []byte{0, 1}),
2976 wantRes: []Transaction{
2981 ID: []byte{0, 0, 0, 0},
2982 ErrorCode: []byte{0, 0, 0, 0},
2984 NewField(fieldData, []byte(
2985 strings.Replace(`Nickname: Testy McTest
2988 Address: 1.2.3.4:12345
2990 -------- File Downloads ---------
2994 ------- Folder Downloads --------
2998 --------- File Uploads ----------
3002 -------- Folder Uploads ---------
3006 ------- Waiting Downloads -------
3010 `, "\n", "\r", -1)),
3012 NewField(fieldUserName, []byte("Testy McTest")),
3016 wantErr: assert.NoError,
3019 for _, tt := range tests {
3020 t.Run(tt.name, func(t *testing.T) {
3021 gotRes, err := HandleGetClientInfoText(tt.args.cc, tt.args.t)
3022 if !tt.wantErr(t, err, fmt.Sprintf("HandleGetClientInfoText(%v, %v)", tt.args.cc, tt.args.t)) {
3025 tranAssertEqual(t, tt.wantRes, gotRes)
3030 func TestHandleTranAgreed(t *testing.T) {
3038 wantRes []Transaction
3039 wantErr assert.ErrorAssertionFunc
3042 name: "normal request flow",
3046 Access: func() accessBitmap {
3047 var bits accessBitmap
3048 bits.Set(accessDisconUser)
3049 bits.Set(accessAnyName)
3053 Flags: []byte{0, 1},
3054 Version: []byte{0, 1},
3056 logger: NewTestLogger(),
3059 BannerFile: "banner.jpg",
3065 NewField(fieldUserName, []byte("username")),
3066 NewField(fieldUserIconID, []byte{0, 1}),
3067 NewField(fieldOptions, []byte{0, 0}),
3070 wantRes: []Transaction{
3072 clientID: &[]byte{0, 1},
3075 Type: []byte{0, 0x7a},
3076 ID: []byte{0, 0, 0, 0},
3077 ErrorCode: []byte{0, 0, 0, 0},
3079 NewField(fieldBannerType, []byte("JPEG")),
3083 clientID: &[]byte{0, 1},
3087 ID: []byte{0, 0, 0, 0},
3088 ErrorCode: []byte{0, 0, 0, 0},
3092 wantErr: assert.NoError,
3095 for _, tt := range tests {
3096 t.Run(tt.name, func(t *testing.T) {
3097 gotRes, err := HandleTranAgreed(tt.args.cc, tt.args.t)
3098 if !tt.wantErr(t, err, fmt.Sprintf("HandleTranAgreed(%v, %v)", tt.args.cc, tt.args.t)) {
3101 tranAssertEqual(t, tt.wantRes, gotRes)
3106 func TestHandleSetClientUserInfo(t *testing.T) {
3114 wantRes []Transaction
3115 wantErr assert.ErrorAssertionFunc
3118 name: "when client does not have accessAnyName",
3122 Access: func() accessBitmap {
3123 var bits accessBitmap
3128 UserName: []byte("Guest"),
3129 Flags: []byte{0, 1},
3131 Clients: map[uint16]*ClientConn{
3139 tranSetClientUserInfo, nil,
3140 NewField(fieldUserIconID, []byte{0, 1}),
3141 NewField(fieldUserName, []byte("NOPE")),
3144 wantRes: []Transaction{
3146 clientID: &[]byte{0, 1},
3149 Type: []byte{0x01, 0x2d},
3150 ID: []byte{0, 0, 0, 0},
3151 ErrorCode: []byte{0, 0, 0, 0},
3153 NewField(fieldUserID, []byte{0, 1}),
3154 NewField(fieldUserIconID, []byte{0, 1}),
3155 NewField(fieldUserFlags, []byte{0, 1}),
3156 NewField(fieldUserName, []byte("Guest"))},
3159 wantErr: assert.NoError,
3162 for _, tt := range tests {
3163 t.Run(tt.name, func(t *testing.T) {
3164 gotRes, err := HandleSetClientUserInfo(tt.args.cc, tt.args.t)
3165 if !tt.wantErr(t, err, fmt.Sprintf("HandleSetClientUserInfo(%v, %v)", tt.args.cc, tt.args.t)) {
3169 tranAssertEqual(t, tt.wantRes, gotRes)
3174 func TestHandleDelNewsItem(t *testing.T) {
3182 wantRes []Transaction
3183 wantErr assert.ErrorAssertionFunc
3186 name: "when user does not have permission to delete a news category",
3190 Access: accessBitmap{},
3194 ThreadedNews: &ThreadedNews{Categories: map[string]NewsCategoryListData15{
3205 tranDelNewsItem, nil,
3206 NewField(fieldNewsPath,
3211 0x74, 0x65, 0x73, 0x74,
3216 wantRes: []Transaction{
3218 clientID: &[]byte{0, 1},
3222 ID: []byte{0, 0, 0, 0},
3223 ErrorCode: []byte{0, 0, 0, 1},
3225 NewField(fieldError, []byte("You are not allowed to delete news categories.")),
3229 wantErr: assert.NoError,
3232 name: "when user does not have permission to delete a news folder",
3236 Access: accessBitmap{},
3240 ThreadedNews: &ThreadedNews{Categories: map[string]NewsCategoryListData15{
3251 tranDelNewsItem, nil,
3252 NewField(fieldNewsPath,
3257 0x74, 0x65, 0x73, 0x74,
3262 wantRes: []Transaction{
3264 clientID: &[]byte{0, 1},
3268 ID: []byte{0, 0, 0, 0},
3269 ErrorCode: []byte{0, 0, 0, 1},
3271 NewField(fieldError, []byte("You are not allowed to delete news folders.")),
3275 wantErr: assert.NoError,
3278 name: "when user deletes a news folder",
3282 Access: func() accessBitmap {
3283 var bits accessBitmap
3284 bits.Set(accessNewsDeleteFldr)
3290 ConfigDir: "/fakeConfigRoot",
3291 FS: func() *MockFileStore {
3292 mfs := &MockFileStore{}
3293 mfs.On("WriteFile", "/fakeConfigRoot/ThreadedNews.yaml", mock.Anything, mock.Anything).Return(nil, os.ErrNotExist)
3296 ThreadedNews: &ThreadedNews{Categories: map[string]NewsCategoryListData15{
3307 tranDelNewsItem, nil,
3308 NewField(fieldNewsPath,
3313 0x74, 0x65, 0x73, 0x74,
3318 wantRes: []Transaction{
3320 clientID: &[]byte{0, 1},
3324 ID: []byte{0, 0, 0, 0},
3325 ErrorCode: []byte{0, 0, 0, 0},
3329 wantErr: assert.NoError,
3332 for _, tt := range tests {
3333 t.Run(tt.name, func(t *testing.T) {
3334 gotRes, err := HandleDelNewsItem(tt.args.cc, tt.args.t)
3335 if !tt.wantErr(t, err, fmt.Sprintf("HandleDelNewsItem(%v, %v)", tt.args.cc, tt.args.t)) {
3338 tranAssertEqual(t, tt.wantRes, gotRes)
3343 func TestHandleDownloadBanner(t *testing.T) {
3351 wantRes []Transaction
3352 wantErr assert.ErrorAssertionFunc
3355 name: "returns expected response",
3359 transfers: map[int]map[[4]byte]*FileTransfer{
3363 ConfigDir: "/config",
3365 BannerFile: "banner.jpg",
3367 fileTransfers: map[[4]byte]*FileTransfer{},
3368 FS: func() *MockFileStore {
3369 mfi := &MockFileInfo{}
3370 mfi.On("Size").Return(int64(100))
3372 mfs := &MockFileStore{}
3373 mfs.On("Stat", "/config/banner.jpg").Return(mfi, nil)
3378 t: NewTransaction(tranDownloadBanner, nil),
3380 wantRes: []Transaction{
3382 clientID: &[]byte{0, 1},
3386 ID: []byte{0, 0, 0, 0},
3387 ErrorCode: []byte{0, 0, 0, 0},
3389 NewField(fieldRefNum, []byte{1, 2, 3, 4}),
3390 NewField(fieldTransferSize, []byte{0, 0, 0, 0x64}),
3394 wantErr: assert.NoError,
3397 for _, tt := range tests {
3398 t.Run(tt.name, func(t *testing.T) {
3399 gotRes, err := HandleDownloadBanner(tt.args.cc, tt.args.t)
3400 if !tt.wantErr(t, err, fmt.Sprintf("HandleDownloadBanner(%v, %v)", tt.args.cc, tt.args.t)) {
3404 tranAssertEqual(t, tt.wantRes, gotRes)
3409 func TestHandleTranOldPostNews(t *testing.T) {
3417 wantRes []Transaction
3418 wantErr assert.ErrorAssertionFunc
3421 name: "when user does not have required permission",
3425 Access: func() accessBitmap {
3426 var bits accessBitmap
3432 tranOldPostNews, &[]byte{0, 1},
3433 NewField(fieldData, []byte("hai")),
3436 wantRes: []Transaction{
3441 ID: []byte{0, 0, 0, 0},
3442 ErrorCode: []byte{0, 0, 0, 1},
3444 NewField(fieldError, []byte("You are not allowed to post news.")),
3448 wantErr: assert.NoError,
3451 name: "when user posts news update",
3455 Access: func() accessBitmap {
3456 var bits accessBitmap
3457 bits.Set(accessNewsPostArt)
3462 FS: func() *MockFileStore {
3463 mfs := &MockFileStore{}
3464 mfs.On("WriteFile", "/fakeConfigRoot/MessageBoard.txt", mock.Anything, mock.Anything).Return(nil, os.ErrNotExist)
3467 ConfigDir: "/fakeConfigRoot",
3472 tranOldPostNews, &[]byte{0, 1},
3473 NewField(fieldData, []byte("hai")),
3476 wantRes: []Transaction{
3481 ID: []byte{0, 0, 0, 0},
3482 ErrorCode: []byte{0, 0, 0, 0},
3485 wantErr: assert.NoError,
3488 for _, tt := range tests {
3489 t.Run(tt.name, func(t *testing.T) {
3490 gotRes, err := HandleTranOldPostNews(tt.args.cc, tt.args.t)
3491 if !tt.wantErr(t, err, fmt.Sprintf("HandleTranOldPostNews(%v, %v)", tt.args.cc, tt.args.t)) {
3495 tranAssertEqual(t, tt.wantRes, gotRes)
3500 func TestHandleInviteNewChat(t *testing.T) {
3508 wantRes []Transaction
3509 wantErr assert.ErrorAssertionFunc
3512 name: "when user does not have required permission",
3516 Access: func() accessBitmap {
3517 var bits accessBitmap
3522 t: NewTransaction(tranInviteNewChat, &[]byte{0, 1}),
3524 wantRes: []Transaction{
3529 ID: []byte{0, 0, 0, 0},
3530 ErrorCode: []byte{0, 0, 0, 1},
3532 NewField(fieldError, []byte("You are not allowed to request private chat.")),
3536 wantErr: assert.NoError,
3539 name: "when userA invites userB to new private chat",
3544 Access: func() accessBitmap {
3545 var bits accessBitmap
3546 bits.Set(accessOpenChat)
3550 UserName: []byte("UserA"),
3552 Flags: []byte{0, 0},
3554 Clients: map[uint16]*ClientConn{
3557 UserName: []byte("UserB"),
3558 Flags: []byte{0, 0},
3561 PrivateChats: make(map[uint32]*PrivateChat),
3565 tranInviteNewChat, &[]byte{0, 1},
3566 NewField(fieldUserID, []byte{0, 2}),
3569 wantRes: []Transaction{
3571 clientID: &[]byte{0, 2},
3574 Type: []byte{0, 0x71},
3575 ID: []byte{0, 0, 0, 0},
3576 ErrorCode: []byte{0, 0, 0, 0},
3578 NewField(fieldChatID, []byte{0x52, 0xfd, 0xfc, 0x07}),
3579 NewField(fieldUserName, []byte("UserA")),
3580 NewField(fieldUserID, []byte{0, 1}),
3585 clientID: &[]byte{0, 1},
3589 ID: []byte{0, 0, 0, 0},
3590 ErrorCode: []byte{0, 0, 0, 0},
3592 NewField(fieldChatID, []byte{0x52, 0xfd, 0xfc, 0x07}),
3593 NewField(fieldUserName, []byte("UserA")),
3594 NewField(fieldUserID, []byte{0, 1}),
3595 NewField(fieldUserIconID, []byte{0, 1}),
3596 NewField(fieldUserFlags, []byte{0, 0}),
3600 wantErr: assert.NoError,
3603 name: "when userA invites userB to new private chat, but UserB has refuse private chat enabled",
3608 Access: func() accessBitmap {
3609 var bits accessBitmap
3610 bits.Set(accessOpenChat)
3614 UserName: []byte("UserA"),
3616 Flags: []byte{0, 0},
3618 Clients: map[uint16]*ClientConn{
3621 UserName: []byte("UserB"),
3622 Flags: []byte{255, 255},
3625 PrivateChats: make(map[uint32]*PrivateChat),
3629 tranInviteNewChat, &[]byte{0, 1},
3630 NewField(fieldUserID, []byte{0, 2}),
3633 wantRes: []Transaction{
3635 clientID: &[]byte{0, 1},
3638 Type: []byte{0, 0x68},
3639 ID: []byte{0, 0, 0, 0},
3640 ErrorCode: []byte{0, 0, 0, 0},
3642 NewField(fieldData, []byte("UserB does not accept private chats.")),
3643 NewField(fieldUserName, []byte("UserB")),
3644 NewField(fieldUserID, []byte{0, 2}),
3645 NewField(fieldOptions, []byte{0, 2}),
3649 clientID: &[]byte{0, 1},
3653 ID: []byte{0, 0, 0, 0},
3654 ErrorCode: []byte{0, 0, 0, 0},
3656 NewField(fieldChatID, []byte{0x52, 0xfd, 0xfc, 0x07}),
3657 NewField(fieldUserName, []byte("UserA")),
3658 NewField(fieldUserID, []byte{0, 1}),
3659 NewField(fieldUserIconID, []byte{0, 1}),
3660 NewField(fieldUserFlags, []byte{0, 0}),
3664 wantErr: assert.NoError,
3667 for _, tt := range tests {
3668 t.Run(tt.name, func(t *testing.T) {
3670 gotRes, err := HandleInviteNewChat(tt.args.cc, tt.args.t)
3671 if !tt.wantErr(t, err, fmt.Sprintf("HandleInviteNewChat(%v, %v)", tt.args.cc, tt.args.t)) {
3674 tranAssertEqual(t, tt.wantRes, gotRes)
3679 func TestHandleGetNewsArtData(t *testing.T) {
3687 wantRes []Transaction
3688 wantErr assert.ErrorAssertionFunc
3691 name: "when user does not have required permission",
3695 Access: func() accessBitmap {
3696 var bits accessBitmap
3701 Accounts: map[string]*Account{},
3705 tranGetNewsArtData, &[]byte{0, 1},
3708 wantRes: []Transaction{
3713 ID: []byte{0x9a, 0xcb, 0x04, 0x42},
3714 ErrorCode: []byte{0, 0, 0, 1},
3716 NewField(fieldError, []byte("You are not allowed to read news.")),
3720 wantErr: assert.NoError,
3723 for _, tt := range tests {
3724 t.Run(tt.name, func(t *testing.T) {
3725 gotRes, err := HandleGetNewsArtData(tt.args.cc, tt.args.t)
3726 if !tt.wantErr(t, err, fmt.Sprintf("HandleGetNewsArtData(%v, %v)", tt.args.cc, tt.args.t)) {
3729 tranAssertEqual(t, tt.wantRes, gotRes)
3734 func TestHandleGetNewsArtNameList(t *testing.T) {
3742 wantRes []Transaction
3743 wantErr assert.ErrorAssertionFunc
3746 name: "when user does not have required permission",
3750 Access: func() accessBitmap {
3751 var bits accessBitmap
3756 Accounts: map[string]*Account{},
3760 tranGetNewsArtNameList, &[]byte{0, 1},
3763 wantRes: []Transaction{
3768 ErrorCode: []byte{0, 0, 0, 1},
3770 NewField(fieldError, []byte("You are not allowed to read news.")),
3774 wantErr: assert.NoError,
3777 for _, tt := range tests {
3778 t.Run(tt.name, func(t *testing.T) {
3779 gotRes, err := HandleGetNewsArtNameList(tt.args.cc, tt.args.t)
3780 if !tt.wantErr(t, err, fmt.Sprintf("HandleGetNewsArtNameList(%v, %v)", tt.args.cc, tt.args.t)) {
3783 tranAssertEqual(t, tt.wantRes, gotRes)
3789 func TestHandleNewNewsFldr(t *testing.T) {
3797 wantRes []Transaction
3798 wantErr assert.ErrorAssertionFunc
3801 name: "when user does not have required permission",
3805 Access: func() accessBitmap {
3806 var bits accessBitmap
3811 Accounts: map[string]*Account{},
3815 tranGetNewsArtNameList, &[]byte{0, 1},
3818 wantRes: []Transaction{
3823 ErrorCode: []byte{0, 0, 0, 1},
3825 NewField(fieldError, []byte("You are not allowed to create news folders.")),
3829 wantErr: assert.NoError,
3832 name: "with a valid request",
3836 Access: func() accessBitmap {
3837 var bits accessBitmap
3838 bits.Set(accessNewsCreateFldr)
3842 logger: NewTestLogger(),
3845 ConfigDir: "/fakeConfigRoot",
3846 FS: func() *MockFileStore {
3847 mfs := &MockFileStore{}
3848 mfs.On("WriteFile", "/fakeConfigRoot/ThreadedNews.yaml", mock.Anything, mock.Anything).Return(nil)
3851 ThreadedNews: &ThreadedNews{Categories: map[string]NewsCategoryListData15{
3857 SubCats: make(map[string]NewsCategoryListData15),
3863 tranGetNewsArtNameList, &[]byte{0, 1},
3864 NewField(fieldFileName, []byte("testFolder")),
3865 NewField(fieldNewsPath,
3870 0x74, 0x65, 0x73, 0x74,
3875 wantRes: []Transaction{
3877 clientID: &[]byte{0, 1},
3881 ID: []byte{0, 0, 0, 0},
3882 ErrorCode: []byte{0, 0, 0, 0},
3886 wantErr: assert.NoError,
3889 // name: "when there is an error writing the threaded news file",
3892 // Account: &Account{
3893 // Access: func() accessBitmap {
3894 // var bits accessBitmap
3895 // bits.Set(accessNewsCreateFldr)
3899 // logger: NewTestLogger(),
3900 // ID: &[]byte{0, 1},
3902 // ConfigDir: "/fakeConfigRoot",
3903 // FS: func() *MockFileStore {
3904 // mfs := &MockFileStore{}
3905 // mfs.On("WriteFile", "/fakeConfigRoot/ThreadedNews.yaml", mock.Anything, mock.Anything).Return(os.ErrNotExist)
3908 // ThreadedNews: &ThreadedNews{Categories: map[string]NewsCategoryListData15{
3910 // Type: []byte{0, 2},
3914 // SubCats: make(map[string]NewsCategoryListData15),
3919 // t: NewTransaction(
3920 // tranGetNewsArtNameList, &[]byte{0, 1},
3921 // NewField(fieldFileName, []byte("testFolder")),
3922 // NewField(fieldNewsPath,
3927 // 0x74, 0x65, 0x73, 0x74,
3932 // wantRes: []Transaction{
3934 // clientID: &[]byte{0, 1},
3937 // Type: []byte{0, 0},
3938 // ErrorCode: []byte{0, 0, 0, 1},
3940 // NewField(fieldError, []byte("Error creating news folder.")),
3944 // wantErr: assert.Error,
3947 for _, tt := range tests {
3948 t.Run(tt.name, func(t *testing.T) {
3949 gotRes, err := HandleNewNewsFldr(tt.args.cc, tt.args.t)
3950 if !tt.wantErr(t, err, fmt.Sprintf("HandleNewNewsFldr(%v, %v)", tt.args.cc, tt.args.t)) {
3953 tranAssertEqual(t, tt.wantRes, gotRes)