github.com/gocaveman/caveman@v0.0.0-20191211162744-0ddf99dbdf6e/regions/regionctrl/regionctrl_test.go (about)

     1  package regionctrl
     2  
     3  import (
     4  	"bytes"
     5  	"encoding/json"
     6  	"io"
     7  	"io/ioutil"
     8  	"net/http"
     9  	"net/http/httptest"
    10  	"testing"
    11  
    12  	"github.com/gocaveman/caveman/migrate"
    13  	"github.com/gocaveman/caveman/migrate/migratedbr"
    14  	"github.com/gocaveman/caveman/regions"
    15  	"github.com/gocaveman/caveman/regions/regionsdb"
    16  	"github.com/stretchr/testify/assert"
    17  
    18  	_ "github.com/mattn/go-sqlite3"
    19  )
    20  
    21  func must(err error) {
    22  	if err != nil {
    23  		panic(err)
    24  	}
    25  }
    26  func mustMarshal(v interface{}) []byte {
    27  	b, err := json.Marshal(v)
    28  	must(err)
    29  	return b
    30  }
    31  func mustUnmarshal(data []byte, v interface{}) {
    32  	err := json.Unmarshal(data, v)
    33  	must(err)
    34  }
    35  func mustReadAll(in io.Reader) []byte {
    36  	b, err := ioutil.ReadAll(in)
    37  	must(err)
    38  	if rc, ok := in.(io.ReadCloser); ok {
    39  		rc.Close()
    40  	}
    41  	return b
    42  }
    43  
    44  func TestRegionController(t *testing.T) {
    45  
    46  	assert := assert.New(t)
    47  
    48  	driver, dsn := "sqlite3", "file:TestDBStore?mode=memory&cache=shared"
    49  
    50  	dbStore := &regionsdb.DBStore{
    51  		DBDriver: driver,
    52  		DBDSN:    dsn,
    53  	}
    54  	assert.NoError(dbStore.AfterWire())
    55  
    56  	ver, err := migratedbr.New(driver, dsn)
    57  	assert.NoError(err)
    58  	runner := migrate.NewRunner(driver, dsn, ver, regionsdb.DefaultRegionsMigrations)
    59  	assert.NoError(runner.RunAllUpToLatest())
    60  
    61  	// assert.NoError(dbStore.WriteDefinition(regions.Definition{
    62  	// 	DefinitionID: "def1",
    63  	// 	RegionName:   "leftnav+",
    64  	// 	TemplateName: "/example1.gohtml",
    65  	// }))
    66  
    67  	store := &regionsdb.DBStore{DBDriver: driver, DBDSN: dsn}
    68  	must(store.AfterWire())
    69  	h := NewRegionController(store)
    70  
    71  	// create one
    72  	wrec := httptest.NewRecorder()
    73  	r, _ := http.NewRequest("POST", "/api/region", bytes.NewReader(mustMarshal(regions.Definition{
    74  		DefinitionID: "def1",
    75  		RegionName:   "leftnav+",
    76  		TemplateName: "/example1.gohtml",
    77  	})))
    78  	r.Header.Set("Content-Type", "application/json")
    79  	h.ServeHTTP(wrec, r)
    80  	assert.Equal(200, wrec.Result().StatusCode)
    81  
    82  	// overwrite it
    83  	wrec = httptest.NewRecorder()
    84  	r, _ = http.NewRequest("POST", "/api/region", bytes.NewReader(mustMarshal(regions.Definition{
    85  		DefinitionID: "def1",
    86  		RegionName:   "leftnav+",
    87  		TemplateName: "/example1a.gohtml",
    88  	})))
    89  	r.Header.Set("Content-Type", "application/json")
    90  	h.ServeHTTP(wrec, r)
    91  	assert.Equal(200, wrec.Result().StatusCode)
    92  
    93  	// add another one
    94  	wrec = httptest.NewRecorder()
    95  	r, _ = http.NewRequest("POST", "/api/region", bytes.NewReader(mustMarshal(regions.Definition{
    96  		DefinitionID: "def2",
    97  		RegionName:   "leftnav+",
    98  		TemplateName: "/example2.gohtml",
    99  	})))
   100  	r.Header.Set("Content-Type", "application/json")
   101  	h.ServeHTTP(wrec, r)
   102  	assert.Equal(200, wrec.Result().StatusCode)
   103  
   104  	// get list and check it
   105  	wrec = httptest.NewRecorder()
   106  	r, _ = http.NewRequest("GET", "/api/region", nil)
   107  	h.ServeHTTP(wrec, r)
   108  	assert.Equal(200, wrec.Result().StatusCode)
   109  	var defList regions.DefinitionList
   110  	mustUnmarshal(mustReadAll(wrec.Result().Body), &defList)
   111  	assert.Len(defList, 2)
   112  	assert.Equal("def1", defList[0].DefinitionID)
   113  	assert.Equal("def2", defList[1].DefinitionID)
   114  
   115  	// delete a record
   116  	wrec = httptest.NewRecorder()
   117  	r, _ = http.NewRequest("DELETE", "/api/region/def1", nil)
   118  	h.ServeHTTP(wrec, r)
   119  	assert.Equal(200, wrec.Result().StatusCode)
   120  
   121  	// make sure it doesn't show any more
   122  	wrec = httptest.NewRecorder()
   123  	r, _ = http.NewRequest("GET", "/api/region", nil)
   124  	h.ServeHTTP(wrec, r)
   125  	assert.Equal(200, wrec.Result().StatusCode)
   126  	defList = nil
   127  	mustUnmarshal(mustReadAll(wrec.Result().Body), &defList)
   128  	assert.Len(defList, 1)
   129  	assert.Equal("def2", defList[0].DefinitionID)
   130  
   131  }