Skip to content

Instantly share code, notes, and snippets.

@nhannqgh
Created June 9, 2021 15:04
Show Gist options
  • Select an option

  • Save nhannqgh/bc323070ecfc1ae056075392840d4fd8 to your computer and use it in GitHub Desktop.

Select an option

Save nhannqgh/bc323070ecfc1ae056075392840d4fd8 to your computer and use it in GitHub Desktop.

Revisions

  1. nhannqgh created this gist Jun 9, 2021.
    138 changes: 138 additions & 0 deletions register_test.go
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,138 @@
    package userbiz

    import (
    "context"
    "errors"
    "fmt"
    usermodel "nhaancs/modules/user/model"
    "testing"
    )

    type mockRegisterStore struct {
    users []usermodel.User
    }

    func NewMockRegisterStore(users []usermodel.User) *mockRegisterStore {
    return &mockRegisterStore{users: users}
    }

    func (m *mockRegisterStore) FindUser(ctx context.Context, conditions map[string]interface{}, moreInfo ...string) (*usermodel.User, error) {
    for _, user := range m.users {
    for k, v := range conditions {
    if k == "email" && user.Email == v {
    return &user, nil
    }
    }
    }
    return nil, errors.New("user not found")
    }
    func (m *mockRegisterStore) CreateUser(ctx context.Context, data *usermodel.UserRegister) error {
    user := usermodel.User{
    Name: data.Name,
    Email: data.Email,
    Password: data.Password,
    Salt: data.Salt,
    }
    m.users = append(m.users, user)
    return nil
    }

    type mockHasher struct {
    }

    func NewMockHasher() *mockHasher {
    return &mockHasher{}
    }

    func (m *mockHasher) Hash(data string) string {
    fmt.Println("hash data: ", data)
    return "hashed" + data
    }

    func TestRegister(t *testing.T) {
    t.Run("should return error if email existed", func(t *testing.T) {
    mockStore := NewMockRegisterStore([]usermodel.User{
    {Email: "nhan@email.com"},
    })
    biz := NewRegisterBiz(mockStore, nil)
    want := ErrEmailExisted
    got := biz.Register(
    context.Background(),
    newRegisterUser("Nhan", "nhan@email.com", "123456"),
    )
    if got != want {
    t.Errorf("got %q, want %q", got, want)
    }
    })

    t.Run("should gen salt for a user", func(t *testing.T) {
    mockHasher := NewMockHasher()
    mockStore := NewMockRegisterStore(nil)
    biz := NewRegisterBiz(mockStore, mockHasher)
    err := biz.Register(
    context.Background(),
    newRegisterUser("Nhan", "nhan@email.com", "123456"),
    )
    if err != nil {
    t.Fatalf("expect no error, but got %q", err)
    }

    createdUser := mockStore.users[0]
    if len(createdUser.Salt) == 0 {
    t.Error("expect salt created but no created")
    }
    })

    t.Run("should gen a different salt for each user", func(t *testing.T) {
    mockHasher := NewMockHasher()
    mockStore := NewMockRegisterStore(nil)
    biz := NewRegisterBiz(mockStore, mockHasher)

    err := biz.Register(
    context.Background(),
    newRegisterUser("Nhan", "nhan@email.com", "123456"),
    )
    if err != nil {
    t.Fatalf("expect no error, but got %q", err)
    }

    err = biz.Register(
    context.Background(),
    newRegisterUser("Nhan2", "nhan2@email.com", "123456"),
    )
    if err != nil {
    t.Fatalf("expect no error, but got %q", err)
    }

    createdUser1 := mockStore.users[0]
    createdUser2 := mockStore.users[1]
    if createdUser1.Salt == createdUser2.Salt {
    t.Error("expect different salts created but created the same salts")
    }
    })

    t.Run("should hash password", func(t *testing.T) {
    mockHasher := NewMockHasher()
    mockStore := NewMockRegisterStore(nil)
    biz := NewRegisterBiz(mockStore, mockHasher)
    rawPassword := "123456"
    registerData := newRegisterUser("Nhan", "nhan@email.com", rawPassword)
    err := biz.Register(context.Background(), registerData)
    if err != nil {
    t.Fatalf("expect no error, but got %q", err)
    }
    createdUser := mockStore.users[0]
    want := "hashed" + rawPassword + createdUser.Salt
    if createdUser.Password != want {
    t.Errorf("got %q, but want %q", createdUser.Password, want)
    }
    })
    }

    func newRegisterUser(name, email, password string) *usermodel.UserRegister {
    return &usermodel.UserRegister{
    Name: name,
    Email: email,
    Password: password,
    }
    }