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  }