github.com/dimeko/sapi@v0.0.0-20231115204413-952501e4268a/api/api_test.go (about) 1 package api 2 3 import ( 4 "bytes" 5 "database/sql" 6 "encoding/json" 7 "fmt" 8 "io/ioutil" 9 "net/http" 10 "net/http/httptest" 11 "os" 12 "path/filepath" 13 "testing" 14 15 "github.com/dimeko/sapi/app" 16 "github.com/dimeko/sapi/models" 17 "github.com/joho/godotenv" 18 "github.com/stretchr/testify/require" 19 ) 20 21 var api *Api 22 var testDbClient *sql.DB 23 24 type ErrorResponse struct { 25 Result string `json:"result"` 26 Message string `json:"message"` 27 } 28 29 type SuccessReponse struct { 30 Result string `json:"result"` 31 Body interface{} `json:"body"` 32 } 33 34 type SingleUserSuccessReponse struct { 35 Result string `json:"result"` 36 Body models.User `json:"body"` 37 } 38 39 type MultipleUserSuccessReponse struct { 40 Result string `json:"result"` 41 Body []models.User `json:"body"` 42 } 43 44 func env() map[string]string { 45 err := godotenv.Load(filepath.Join("./", ".env")) 46 if err != nil { 47 panic("Cannot find .env file") 48 } 49 return map[string]string{ 50 "username": os.Getenv("POSTGRES_USER"), 51 "host": os.Getenv("POSTGRES_HOST"), 52 "password": os.Getenv("POSTGRES_PASSWORD"), 53 "db_name": os.Getenv("POSTGRES_DB"), 54 "port": os.Getenv("POSTGRES_PORT"), 55 } 56 } 57 58 func TestMain(m *testing.M) { 59 os.Chdir("../") 60 envVars := env() 61 host := envVars["host"] 62 port := envVars["port"] 63 user := envVars["username"] 64 password := envVars["password"] 65 dbname := envVars["db_name"] 66 67 psqlInfo := fmt.Sprintf("host=%s port=%s user=%s password=%s dbname=%s sslmode=disable", host, port, user, password, dbname) 68 69 var err error 70 testDbClient, err = sql.Open("postgres", psqlInfo) 71 72 if err != nil { 73 panic(err) 74 } 75 app := app.New() 76 api = New(app) 77 tst := m.Run() 78 tearDownDatabase() 79 os.Exit(tst) 80 } 81 82 func tearDownDatabase() { 83 84 testDbClient.Exec("DELETE FROM users") 85 } 86 87 func TestCreate(t *testing.T) { 88 server, _ := initServer(t) 89 defer tearDownDatabase() 90 defer server.Close() 91 } 92 93 func TestGet(t *testing.T) { 94 server, users := initServer(t) 95 defer tearDownDatabase() 96 defer server.Close() 97 t.Run("found user", func(t *testing.T) { 98 resp, err := http.Get(server.URL + "/get/" + users[0].Id) 99 require.NoError(t, err) 100 var result SingleUserSuccessReponse 101 body, err := ioutil.ReadAll(resp.Body) 102 json.Unmarshal(body, &result) 103 require.Equal(t, users[0].Username, result.Body.Username) 104 }) 105 106 } 107 108 func TestList(t *testing.T) { 109 server, _ := initServer(t) 110 defer tearDownDatabase() 111 defer server.Close() 112 t.Run("listing users", func(t *testing.T) { 113 resp, err := http.Get(server.URL + "/list") 114 require.NoError(t, err) 115 var result MultipleUserSuccessReponse 116 body, err := ioutil.ReadAll(resp.Body) 117 json.Unmarshal(body, &result) 118 require.Equal(t, 4, len(result.Body)) 119 }) 120 tearDownDatabase() 121 } 122 123 func initServer(t *testing.T) (*httptest.Server, []models.User) { 124 ts := httptest.NewServer(api.Router) 125 client := &http.Client{} 126 127 var u1 = []byte(`{"username":"user_one", "firstname": "Nick", "lastname": "Jonas"}`) 128 req1, _ := http.NewRequest("POST", ts.URL+"/create", bytes.NewBuffer(u1)) 129 130 req1.Header.Set("Content-Type", "application/json") 131 resp1, _ := client.Do(req1) 132 defer resp1.Body.Close() 133 134 var u2 = []byte(`{"username": "user_two", "firstname": "George", "lastname": "Harrison"}`) 135 req2, _ := http.NewRequest("POST", ts.URL+"/create", bytes.NewBuffer(u2)) 136 req2.Header.Set("Content-Type", "application/json") 137 resp2, _ := client.Do(req2) 138 defer resp2.Body.Close() 139 140 var u3 = []byte(`{"username": "user_three", "firstname": "Amy", "lastname": "Winehouse"}`) 141 req3, _ := http.NewRequest("POST", ts.URL+"/create", bytes.NewBuffer(u3)) 142 req3.Header.Set("Content-Type", "application/json") 143 resp3, _ := client.Do(req3) 144 defer resp3.Body.Close() 145 146 var u4 = []byte(`{"username": "user_four", "firstname": "Rihanna", "lastname": "Beyonce"}`) 147 req4, _ := http.NewRequest("POST", ts.URL+"/create", bytes.NewBuffer(u4)) 148 req4.Header.Set("Content-Type", "application/json") 149 resp4, _ := client.Do(req4) 150 defer resp4.Body.Close() 151 152 var u1r SingleUserSuccessReponse 153 body, err := ioutil.ReadAll(resp1.Body) 154 require.NoError(t, err) 155 json.Unmarshal(body, &u1r) 156 require.Equal(t, "user_one", u1r.Body.Username) 157 require.Equal(t, "Nick", u1r.Body.Firstname) 158 159 var u2r SingleUserSuccessReponse 160 body, err = ioutil.ReadAll(resp2.Body) 161 require.NoError(t, err) 162 json.Unmarshal(body, &u2r) 163 164 require.Equal(t, "user_two", u2r.Body.Username) 165 require.Equal(t, "George", u2r.Body.Firstname) 166 167 var u3r SingleUserSuccessReponse 168 body, err = ioutil.ReadAll(resp3.Body) 169 require.NoError(t, err) 170 json.Unmarshal(body, &u3r) 171 require.Equal(t, "user_three", u3r.Body.Username) 172 require.Equal(t, "Amy", u3r.Body.Firstname) 173 174 var u4r SingleUserSuccessReponse 175 body, err = ioutil.ReadAll(resp4.Body) 176 require.NoError(t, err) 177 json.Unmarshal(body, &u4r) 178 require.Equal(t, "user_four", u4r.Body.Username) 179 require.Equal(t, "Rihanna", u4r.Body.Firstname) 180 181 return ts, []models.User{u1r.Body, u2r.Body, u3r.Body, u4r.Body} 182 }