github.com/mssola/todo@v0.0.0-20181029153210-d25348dc3f48/app/users_test.go (about)

     1  // Copyright (C) 2014-2017 Miquel Sabaté Solà <mikisabate@gmail.com>
     2  //
     3  // This Source Code Form is subject to the terms of the Mozilla Public
     4  // License, v. 2.0. If a copy of the MPL was not distributed with this
     5  // file, You can obtain one at http://mozilla.org/MPL/2.0/.
     6  
     7  package app
     8  
     9  import (
    10  	"net/http"
    11  	"net/http/httptest"
    12  	"net/url"
    13  	"testing"
    14  
    15  	"github.com/mssola/go-utils/security"
    16  )
    17  
    18  func TestCreateUser(t *testing.T) {
    19  	initTestDB()
    20  	defer closeTestDB()
    21  
    22  	// There's nothing before.
    23  	var u User
    24  	err := Db.SelectOne(&u, "select * from users")
    25  	if err == nil {
    26  		t.Fatalf("Should be not nil")
    27  	}
    28  	if u.ID != "" {
    29  		t.Fatalf("Expected to be empty")
    30  	}
    31  
    32  	// Now we create a user.
    33  	err = createUser("u1", "1234")
    34  	if err != nil {
    35  		t.Fatalf("Expected to be nil: %v", err)
    36  	}
    37  	err = Db.SelectOne(&u, "select * from users")
    38  	if u.ID == "" {
    39  		t.Fatalf("Expected to not be empty")
    40  	}
    41  	if u.Name != "u1" {
    42  		t.Fatalf("Got %v; Expected: %v", u.Name, "u1")
    43  	}
    44  	if u.PasswordHash == "" {
    45  		t.Fatalf("Expected to not be empty")
    46  	}
    47  
    48  	// We cannot create another user.
    49  	err = createUser("u2", "1234")
    50  	if err == nil {
    51  		t.Fatalf("Should be not nil")
    52  	}
    53  	if err.Error() != "too many users" {
    54  		t.Fatalf("Got %v; Expected: %v", err.Error(), "too many users")
    55  	}
    56  }
    57  
    58  func TestMatchPassword(t *testing.T) {
    59  	initTestDB()
    60  	defer closeTestDB()
    61  
    62  	// User does not exist.
    63  	u, err := matchPassword("u", "1234")
    64  	if err == nil {
    65  		t.Fatalf("Should be not nil")
    66  	}
    67  
    68  	// User exists but has a different password.
    69  	password := security.PasswordSalt("1111")
    70  	err = createUser("u", password)
    71  	if err != nil {
    72  		t.Fatalf("Expected to be nil: %v", err)
    73  	}
    74  	u, err = matchPassword("u", "1234")
    75  	if err == nil {
    76  		t.Fatalf("Should be not nil")
    77  	}
    78  
    79  	// User exists and has this password.
    80  	u, err = matchPassword("u", "1111")
    81  	if err != nil {
    82  		t.Fatalf("Expected to be nil: %v", err)
    83  	}
    84  	if u == "" {
    85  		t.Fatalf("Expected to not be empty")
    86  	}
    87  }
    88  
    89  func TestUsersCreate(t *testing.T) {
    90  	initTestDB()
    91  	defer closeTestDB()
    92  
    93  	param := make(url.Values)
    94  	param["name"] = []string{"user"}
    95  	param["password"] = []string{"1234"}
    96  
    97  	req, err := http.NewRequest("POST", "/users", nil)
    98  	if err != nil {
    99  		t.Fatalf("Expected to be nil: %v", err)
   100  	}
   101  	req.PostForm = param
   102  	w := httptest.NewRecorder()
   103  	UsersCreate(w, req)
   104  
   105  	if w.Code != 302 {
   106  		t.Fatalf("Got %v; Expected: %v", w.Code, 302)
   107  	}
   108  	if w.HeaderMap["Location"][0] != "/" {
   109  		t.Fatalf("Got %v; Expected: %v", w.HeaderMap["Location"][0], "/")
   110  	}
   111  
   112  	var user User
   113  	err = Db.SelectOne(&user, "select * from users")
   114  	if err != nil {
   115  		t.Fatalf("Expected to be nil: %v", err)
   116  	}
   117  	if user.ID == "" {
   118  		t.Fatalf("Expected to not be empty")
   119  	}
   120  	if user.Name != "user" {
   121  		t.Fatalf("Got %v; Expected: %v", user.Name, "user")
   122  	}
   123  	if user.PasswordHash == "" {
   124  		t.Fatalf("Expected to not be empty")
   125  	}
   126  }
   127  
   128  func TestUserCreateAlreadyExists(t *testing.T) {
   129  	initTestDB()
   130  	defer closeTestDB()
   131  
   132  	password := security.PasswordSalt("1234")
   133  	createUser("user", password)
   134  
   135  	param := make(url.Values)
   136  	param["name"] = []string{"another"}
   137  	param["password"] = []string{"1234"}
   138  
   139  	req, err := http.NewRequest("POST", "/", nil)
   140  	if err != nil {
   141  		t.Fatalf("Expected to be nil: %v", err)
   142  	}
   143  	req.PostForm = param
   144  	w := httptest.NewRecorder()
   145  	UsersCreate(w, req)
   146  
   147  	if w.Code != 403 {
   148  		t.Fatalf("Got %v; Expected: %v", w.Code, 403)
   149  	}
   150  	if w.HeaderMap["Location"][0] != "/" {
   151  		t.Fatalf("Got %v; Expected: %v", w.HeaderMap["Location"][0], "/")
   152  	}
   153  
   154  	var user User
   155  	err = Db.SelectOne(&user, "select * from users")
   156  	if err != nil {
   157  		t.Fatalf("Expected to be nil: %v", err)
   158  	}
   159  	if user.ID == "" {
   160  		t.Fatalf("Expected to not be empty")
   161  	}
   162  	if user.Name != "user" {
   163  		t.Fatalf("Got %v; Expected: %v", user.Name, "user")
   164  	}
   165  	if user.PasswordHash == "" {
   166  		t.Fatalf("Expected to not be empty")
   167  	}
   168  }