github.com/inhzus/go-berater@v0.0.0-20190602170559-fb80cb14726b/routes/v1/api/api_test.go (about) 1 package api 2 3 import ( 4 "encoding/json" 5 "github.com/gin-gonic/gin" 6 "github.com/inhzus/go-berater/config" 7 "github.com/inhzus/go-berater/models" 8 "gopkg.in/go-playground/assert.v1" 9 "net/http" 10 "net/http/httptest" 11 "os" 12 "runtime" 13 "strconv" 14 "strings" 15 "testing" 16 ) 17 18 func getEngine() *gin.Engine { 19 20 _, filename, _, _ := runtime.Caller(0) 21 paths := strings.Split(filename, "/") 22 workDir := strings.Join(paths[:len(paths)-4], "/") 23 _ = os.Chdir(workDir) 24 models.Setup() 25 config.Setup() 26 engine := gin.Default() 27 ApplyRoutes(engine.Group("/")) 28 return engine 29 } 30 31 func getTestToken() string { 32 req := httptest.NewRequest("GET", "/api/test/token/test", nil) 33 34 w := httptest.NewRecorder() 35 r := getEngine() 36 r.ServeHTTP(w, req) 37 38 var response map[string]string 39 _ = json.Unmarshal(w.Body.Bytes(), &response) 40 return "Bearer " + response["token"] 41 } 42 43 func TestTestToken(t *testing.T) { 44 req := httptest.NewRequest("GET", "/api/test/token/test", nil) 45 46 w := httptest.NewRecorder() 47 r := getEngine() 48 r.ServeHTTP(w, req) 49 50 assert.Equal(t, http.StatusOK, w.Code) 51 var response map[string]string 52 err := json.Unmarshal(w.Body.Bytes(), &response) 53 assert.Equal(t, err, nil) 54 _, exist := response["token"] 55 assert.Equal(t, exist, true) 56 } 57 58 func TestCheckToken(t *testing.T) { 59 req := httptest.NewRequest("GET", "/api/token", nil) 60 61 r := getEngine() 62 63 q := httptest.NewRecorder() 64 r.ServeHTTP(q, req) 65 assert.Equal(t, http.StatusUnauthorized, q.Code) 66 67 w := httptest.NewRecorder() 68 req.Header.Set("Authorization", getTestToken()) 69 r.ServeHTTP(w, req) 70 assert.Equal(t, http.StatusOK, w.Code) 71 } 72 73 func TestSendCode(t *testing.T) { 74 r := getEngine() 75 token := getTestToken() 76 req := httptest.NewRequest("POST", "/api/code", nil) 77 req.Header.Set("Authorization", token) 78 w := httptest.NewRecorder() 79 r.ServeHTTP(w, req) 80 81 assert.Equal(t, w.Code, http.StatusBadRequest) 82 83 bodyString := `{"phone": "0"}` 84 req = httptest.NewRequest("POST", "/api/code", strings.NewReader(bodyString)) 85 req.Header.Set("Content-Type", "application/json") 86 req.Header.Set("Authorization", token) 87 w = httptest.NewRecorder() 88 r.ServeHTTP(w, req) 89 90 assert.Equal(t, w.Code, http.StatusInternalServerError) 91 } 92 93 func TestCheckCode(t *testing.T) { 94 client.Del("test_code") 95 96 r := getEngine() 97 genCode := "9999" 98 req := httptest.NewRequest("GET", "/api/code/"+genCode, nil) 99 req.Header.Set("Authorization", getTestToken()) 100 101 w := httptest.NewRecorder() 102 r.ServeHTTP(w, req) 103 104 assert.Equal(t, w.Code, http.StatusNotFound) 105 106 client.HMSet("test_code", map[string]interface{}{ 107 "code": genCode, 108 "phone": "0", 109 "status": false, 110 }) 111 q := httptest.NewRecorder() 112 r.ServeHTTP(q, req) 113 assert.Equal(t, q.Code, http.StatusOK) 114 115 ret, _ := client.HGet("test_code", "status").Result() 116 117 status, _ := strconv.ParseBool(ret) 118 assert.Equal(t, status, true) 119 client.Del("test_code") 120 } 121 122 func TestAddCandidate(t *testing.T) { 123 r := getEngine() 124 redisKey := "test_code" 125 client.Del(redisKey) 126 client.HMSet(redisKey, map[string]interface{}{ 127 "code": "9999", 128 "phone": "0", 129 "status": false, 130 }) 131 if models.ExistCandidateById("test") { 132 models.RemoveCandidateById("test") 133 } 134 135 token := getTestToken() 136 137 req := httptest.NewRequest("POST", "/api/candidate", nil) 138 req.Header.Set("Authorization", token) 139 w := httptest.NewRecorder() 140 r.ServeHTTP(w, req) 141 assert.Equal(t, w.Code, http.StatusBadRequest) 142 143 bodyBytes := `{"phone": "0","name": "inh","province": "sx","city": "123456","score": "675.5","subject": "li"}` 144 145 req = httptest.NewRequest("POST", "/api/candidate", strings.NewReader(bodyBytes)) 146 req.Header.Set("Content-Type", "application/json") 147 req.Header.Set("Authorization", token) 148 149 w = httptest.NewRecorder() 150 r.ServeHTTP(w, req) 151 assert.Equal(t, w.Code, http.StatusUnauthorized) 152 153 client.HSet(redisKey, "status", true) 154 155 req = httptest.NewRequest("POST", "/api/candidate", strings.NewReader(bodyBytes)) 156 req.Header.Set("Content-Type", "application/json") 157 req.Header.Set("Authorization", token) 158 159 w = httptest.NewRecorder() 160 r.ServeHTTP(w, req) 161 assert.Equal(t, w.Code, http.StatusOK) 162 163 req = httptest.NewRequest("POST", "/api/candidate", nil) 164 req.Header.Set("Authorization", token) 165 w = httptest.NewRecorder() 166 r.ServeHTTP(w, req) 167 assert.Equal(t, w.Code, http.StatusConflict) 168 169 client.Del(redisKey) 170 models.RemoveCandidateById("test") 171 } 172 173 func TestUpdateCandidate(t *testing.T) { 174 r := getEngine() 175 176 redisKey := "test_code" 177 client.Del(redisKey) 178 models.RemoveCandidateById("test") 179 180 token := getTestToken() 181 req := httptest.NewRequest("PATCH", "/api/candidate", nil) 182 req.Header.Set("Authorization", token) 183 184 w := httptest.NewRecorder() 185 r.ServeHTTP(w, req) 186 assert.Equal(t, w.Code, http.StatusNotFound) 187 188 var added models.Candidate 189 addedString := `{"openid":"test","phone": "0","name": "inh","province": "sx","city": "123456","score": "675.5","subject": "li"}` 190 err := json.Unmarshal([]byte(addedString), &added) 191 assert.Equal(t, err, nil) 192 _ = models.AddCandidate(&added) 193 194 w = httptest.NewRecorder() 195 r.ServeHTTP(w, req) 196 assert.Equal(t, w.Code, http.StatusBadRequest) 197 198 bodyString := `{"phone":"1","subject":"wen"}` 199 req = httptest.NewRequest("PATCH", "/api/candidate", strings.NewReader(bodyString)) 200 req.Header.Set("Authorization", token) 201 req.Header.Set("Content-Type", "application/json") 202 w = httptest.NewRecorder() 203 r.ServeHTTP(w, req) 204 assert.Equal(t, w.Code, http.StatusUnauthorized) 205 206 bodyString = `{"subject":"wen"}` 207 req = httptest.NewRequest("PATCH", "/api/candidate", strings.NewReader(bodyString)) 208 req.Header.Set("Authorization", token) 209 req.Header.Set("Content-Type", "application/json") 210 w = httptest.NewRecorder() 211 r.ServeHTTP(w, req) 212 assert.Equal(t, w.Code, http.StatusOK) 213 assert.Equal(t, models.GetCandidateById("test").Subject, "wen") 214 215 client.HMSet(redisKey, map[string]interface{}{ 216 "status": false, 217 "phone": "1", 218 "code": "9999", 219 }) 220 bodyString = `{"subject":"wex","phone":"1"}` 221 req = httptest.NewRequest("PATCH", "/api/candidate", strings.NewReader(bodyString)) 222 req.Header.Set("Authorization", token) 223 req.Header.Set("Content-Type", "application/json") 224 w = httptest.NewRecorder() 225 r.ServeHTTP(w, req) 226 assert.Equal(t, w.Code, http.StatusUnauthorized) 227 228 client.HSet(redisKey, "status", true) 229 bodyString = `{"subject":"wex","phone":"1"}` 230 req = httptest.NewRequest("PATCH", "/api/candidate", strings.NewReader(bodyString)) 231 req.Header.Set("Authorization", token) 232 req.Header.Set("Content-Type", "application/json") 233 w = httptest.NewRecorder() 234 r.ServeHTTP(w, req) 235 assert.Equal(t, w.Code, http.StatusOK) 236 237 bodyString = `{"subject":"wex","phone":"2"}` 238 req = httptest.NewRequest("PATCH", "/api/candidate", strings.NewReader(bodyString)) 239 req.Header.Set("Authorization", token) 240 req.Header.Set("Content-Type", "application/json") 241 w = httptest.NewRecorder() 242 r.ServeHTTP(w, req) 243 assert.Equal(t, w.Code, http.StatusUnauthorized) 244 245 246 models.RemoveCandidateById("openid") 247 client.Del(redisKey) 248 }