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  }