+
+func TestNewUser(t *testing.T) {
+ srv, _, _ := StartTestServer()
+
+ tests := []testCase{
+ //{
+ // name: "a valid new account",
+ // mockHandler: func() mockClientHandler {
+ // mh := mockClientHandler{}
+ // mh.On("Handle", mock.AnythingOfType("*hotline.Client"), mock.MatchedBy(func(t *Transaction) bool {
+ // println("@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@")
+ // spew.Dump(t.Type)
+ // spew.Dump(bytes.Equal(t.Type, []byte{0x01, 0x5e}))
+ // //if !bytes.Equal(t.GetField(fieldError).Data, []byte("You are not allowed to create new accounts.")) {
+ // // return false
+ // //}
+ // return bytes.Equal(t.Type, []byte{0x01, 0x5e},
+ // )
+ // })).Return(
+ // []Transaction{}, nil,
+ // )
+ //
+ // clientHandlers[tranNewUser] = mh
+ // return mh
+ // }(),
+ // client: func() *Client {
+ // c := NewClient("testUser", NewTestLogger())
+ // return c
+ // }(),
+ // teardown: func() {
+ // _ = srv.DeleteUser("testUser")
+ // },
+ // account: Account{
+ // Login: "test",
+ // Name: "unnamed",
+ // Password: "test",
+ // Access: &[]byte{255, 255, 255, 255, 255, 255, 255, 255},
+ // },
+ // request: NewTransaction(
+ // tranNewUser, nil,
+ // NewField(fieldUserLogin, []byte(NegatedUserString([]byte("testUser")))),
+ // NewField(fieldUserName, []byte("testUserName")),
+ // NewField(fieldUserPassword, []byte(NegatedUserString([]byte("testPw")))),
+ // NewField(fieldUserAccess, []byte{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}),
+ // ),
+ // want: &Transaction{
+ // Fields: []Field{},
+ // },
+ //},
+ //{
+ // name: "a newUser request from a user without the required access",
+ // mockHandler: func() *mockClientHandler {
+ // mh := mockClientHandler{}
+ // mh.On("Handle", mock.AnythingOfType("*hotline.Client"), mock.MatchedBy(func(t *Transaction) bool {
+ // if !bytes.Equal(t.GetField(fieldError).Data, []byte("You are not allowed to create new accounts.")) {
+ // return false
+ // }
+ // return bytes.Equal(t.Type, []byte{0x01, 0x5e})
+ // })).Return(
+ // []Transaction{}, nil,
+ // )
+ // return &mh
+ // }(),
+ // teardown: func() {
+ // _ = srv.DeleteUser("testUser")
+ // },
+ // account: Account{
+ // Login: "test",
+ // Name: "unnamed",
+ // Password: "test",
+ // Access: &[]byte{0, 0, 0, 0, 0, 0, 0, 0},
+ // },
+ // request: NewTransaction(
+ // tranNewUser, nil,
+ // NewField(fieldUserLogin, []byte(NegatedUserString([]byte("testUser")))),
+ // NewField(fieldUserName, []byte("testUserName")),
+ // NewField(fieldUserPassword, []byte(NegatedUserString([]byte("testPw")))),
+ // NewField(fieldUserAccess, []byte{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}),
+ // ),
+ //},
+ //{
+ // name: "when user does not have required permission",
+ // mockHandler: func() map[int]*mockClientHandler {
+ // mockHandlers := make(map[int]*mockClientHandler)
+ //
+ // mh := mockClientHandler{}
+ // mh.On("Handle", mock.AnythingOfType("*hotline.Client"), mock.MatchedBy(func(t *Transaction) bool {
+ // return t.equal(Transaction{
+ // Type: []byte{0x01, 0x5e},
+ // IsReply: 1,
+ // ErrorCode: []byte{0, 0, 0, 1},
+ // Fields: []Field{
+ // NewField(fieldError, []byte("You are not allowed to create new accounts.")),
+ // },
+ // })
+ // })).Return(
+ // []Transaction{}, nil,
+ // )
+ // mockHandlers[tranNewUser] = &mh
+ //
+ // return mockHandlers
+ // }(),
+ //
+ // teardown: func() {
+ // _ = srv.DeleteUser("testUser")
+ // },
+ // account: Account{
+ // Login: "test",
+ // Name: "unnamed",
+ // Password: "test",
+ // Access: &[]byte{0, 0, 0, 0, 0, 0, 0, 0},
+ // },
+ // request: NewTransaction(
+ // tranNewUser, nil,
+ // NewField(fieldUserLogin, []byte(NegatedUserString([]byte("testUser")))),
+ // NewField(fieldUserName, []byte("testUserName")),
+ // NewField(fieldUserPassword, []byte(NegatedUserString([]byte("testPw")))),
+ // NewField(fieldUserAccess, []byte{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}),
+ // ),
+ //},
+
+ //{
+ // name: "a request to create a user that already exists",
+ // setup: func() {
+ //
+ // },
+ // teardown: func() {
+ // _ = srv.DeleteUser("testUser")
+ // },
+ // account: Account{
+ // Login: "test",
+ // Name: "unnamed",
+ // Password: "test",
+ // Access: &[]byte{255, 255, 255, 255, 255, 255, 255, 255},
+ // },
+ // request: NewTransaction(
+ // tranNewUser, nil,
+ // NewField(fieldUserLogin, []byte(NegatedUserString([]byte("guest")))),
+ // NewField(fieldUserName, []byte("testUserName")),
+ // NewField(fieldUserPassword, []byte(NegatedUserString([]byte("testPw")))),
+ // NewField(fieldUserAccess, []byte{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}),
+ // ),
+ // want: &Transaction{
+ // Fields: []Field{
+ // NewField(fieldError, []byte("Cannot create account guest because there is already an account with that login.")),
+ // },
+ // },
+ //},
+ }
+
+ for _, test := range tests {
+ t.Run(test.name, func(t *testing.T) {
+ test.Setup(srv)
+
+ // move to Setup?
+ c := NewClient(test.account.Name, NewTestLogger())
+ err := c.JoinServer(fmt.Sprintf(":%v", srv.APIPort()), test.account.Login, test.account.Password)
+ if err != nil {
+ t.Errorf("login failed: %v", err)
+ }
+ // end move to Setup??
+
+ for key, value := range test.mockHandler {
+ c.Handlers[uint16(key)] = value
+ }
+
+ // send test case request
+ _ = c.Send(*test.request)
+
+ //time.Sleep(1 * time.Second)
+ // ===
+
+ transactions, _ := readN(c.Connection, 1)
+ for _, t := range transactions {
+ _ = c.HandleTransaction(&t)
+ }
+
+ // ===
+
+ for _, handler := range test.mockHandler {
+ handler.AssertExpectations(t)
+ }
+
+ test.Teardown(srv)
+ })
+ }
+}
+
+func tranAssertEqual(t *testing.T, tran1, tran2 []Transaction) bool {
+ var newT1 []Transaction
+ var newT2 []Transaction
+ for _, trans := range tran1 {
+ trans.ID = []byte{0, 0, 0, 0}
+ newT1 = append(newT1, trans)
+ }
+
+ for _, trans := range tran2 {
+ trans.ID = []byte{0, 0, 0, 0}
+ newT2 = append(newT2, trans)
+
+ }
+
+ return assert.Equal(t, newT1, newT2)
+}