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 }