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 := ®ionsdb.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 := ®ionsdb.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 }