github.com/hoffie/larasync@v0.0.0-20151025221940-0384d2bddcef/api/server/nibPut_test.go (about) 1 package server 2 3 import ( 4 "encoding/json" 5 "io/ioutil" 6 "net/http" 7 8 "github.com/hoffie/larasync/api" 9 "github.com/hoffie/larasync/helpers" 10 "github.com/hoffie/larasync/repository/nib" 11 12 . "gopkg.in/check.v1" 13 ) 14 15 type NIBPutTest struct { 16 NIBItemTest 17 } 18 19 var _ = Suite(&NIBPutTest{getNIBItemTest()}) 20 21 func (t *NIBPutTest) SetUpTest(c *C) { 22 t.NIBItemTest.SetUpTest(c) 23 t.httpMethod = "PUT" 24 t.req = t.requestWithBytes(c, t.signNIBBytes(c, t.getTestNIBBytes())) 25 t.createRepository(c) 26 } 27 28 func (t *NIBPutTest) TestUnauthorized(c *C) { 29 resp := t.getResponse(t.req) 30 c.Assert(resp.Code, Equals, http.StatusUnauthorized) 31 } 32 33 func (t *NIBPutTest) TestRepositoryNotExisting(c *C) { 34 t.repositoryName = "does-not-exist" 35 t.req = t.requestEmptyBody(c) 36 t.signRequest() 37 resp := t.getResponse(t.req) 38 c.Assert(resp.Code, Equals, http.StatusUnauthorized) 39 } 40 41 func (t *NIBPutTest) TestPutMalformedSignature(c *C) { 42 data := t.getTestNIBBytes() 43 data = t.signNIBBytes(c, data) 44 45 // destroy signature: 46 for x := 0; x < SignatureSize; x++ { 47 data[len(data)-1-x] = 0 48 } 49 t.req = t.requestWithBytes(c, data) 50 t.signRequest() 51 52 resp := t.getResponse(t.req) 53 54 c.Assert(resp.Code, Equals, http.StatusUnauthorized) 55 repo := t.getRepository(c) 56 c.Assert(repo.HasNIB(t.nibID), Equals, false) 57 } 58 59 func (t *NIBPutTest) TestPutMalformedData(c *C) { 60 data := t.getTestNIBBytes() 61 data[0] = 0 62 data = t.signNIBBytes(c, data) 63 t.req = t.requestWithBytes(c, data) 64 t.signRequest() 65 66 resp := t.getResponse(t.req) 67 68 c.Assert(resp.Code, Equals, http.StatusBadRequest) 69 repo := t.getRepository(c) 70 c.Assert(repo.HasNIB(t.nibID), Equals, false) 71 } 72 73 func (t *NIBPutTest) TestPutNew(c *C) { 74 t.fillContentOfDefaultNIB(c) 75 t.signRequest() 76 resp := t.getResponse(t.req) 77 c.Assert(resp.Code, Equals, http.StatusCreated) 78 } 79 80 func (t *NIBPutTest) TestPutNewStore(c *C) { 81 r := t.getRepository(c) 82 t.fillContentOfDefaultNIB(c) 83 84 t.signRequest() 85 t.getResponse(t.req) 86 87 n, err := r.GetNIB(t.nibID) 88 c.Assert(err, IsNil) 89 c.Assert(n.ID, Equals, t.nibID) 90 } 91 92 func (t *NIBPutTest) TestPutNewPrecondition(c *C) { 93 t.addTestNIB(c) 94 header := t.req.Header 95 rep := t.getRepository(c) 96 transaction, err := rep.CurrentTransaction() 97 c.Assert(err, IsNil) 98 header.Set("If-Match", transaction.IDString()) 99 t.signRequest() 100 101 resp := t.getResponse(t.req) 102 c.Assert(resp.Code, Equals, http.StatusOK) 103 } 104 105 func (t *NIBPutTest) TestPutNewPreconditionFailed(c *C) { 106 t.addTestNIB(c) 107 header := t.req.Header 108 rep := t.getRepository(c) 109 transaction, err := rep.CurrentTransaction() 110 c.Assert(err, IsNil) 111 header.Set("If-Match", transaction.PreviousIDString()) 112 t.signRequest() 113 114 resp := t.getResponse(t.req) 115 c.Assert(resp.Code, Equals, http.StatusPreconditionFailed) 116 } 117 118 func (t *NIBPutTest) changeNIBForPut(c *C, n *nib.NIB) *nib.NIB { 119 revision := generateTestRevision() 120 revision.MetadataID = "other-metadata" 121 revision.DeviceID = "other-id" 122 123 n.AppendRevision(revision) 124 return n 125 } 126 127 func (t *NIBPutTest) requestWithNib(c *C, n *nib.NIB) *http.Request { 128 signedData := t.signNIBBytes( 129 c, 130 t.nibToBytes(n), 131 ) 132 return t.requestWithBytes(c, signedData) 133 } 134 135 func (t *NIBPutTest) TestPutUpdate(c *C) { 136 n := t.addTestNIB(c) 137 n = t.changeNIBForPut(c, n) 138 repo := t.getRepository(c) 139 t.fillNIBContentObjects(c, repo, n) 140 t.req = t.requestWithNib(c, n) 141 t.signRequest() 142 143 resp := t.getResponse(t.req) 144 c.Assert(resp.Code, Equals, http.StatusOK) 145 } 146 147 func (t *NIBPutTest) TestPutChanged(c *C) { 148 n := t.normalPut(c) 149 repo := t.getRepository(c) 150 repoNib, err := repo.GetNIB(n.ID) 151 c.Assert(err, IsNil) 152 153 revisions := repoNib.Revisions 154 c.Assert(len(revisions), Equals, 2) 155 156 c.Assert(revisions[1].DeviceID, Equals, "other-id") 157 } 158 159 func (t *NIBPutTest) TestPutConflict(c *C) { 160 n := t.normalPut(c) 161 latestRev, err := n.LatestRevision() 162 c.Assert(err, IsNil) 163 latestRev.ContentIDs = []string{"changed"} 164 repo := t.getRepository(c) 165 t.fillNIBContentObjects(c, repo, n) 166 t.req = t.requestWithNib(c, n) 167 t.signRequest() 168 169 resp := t.getResponse(t.req) 170 c.Assert(resp.Code, Equals, http.StatusConflict) 171 172 } 173 174 func (t *NIBPutTest) normalPut(c *C) *nib.NIB { 175 n := t.addTestNIB(c) 176 n = t.changeNIBForPut(c, n) 177 repo := t.getRepository(c) 178 t.fillNIBContentObjects(c, repo, n) 179 180 t.req = t.requestWithNib(c, n) 181 t.signRequest() 182 183 resp := t.getResponse(t.req) 184 c.Assert(resp.Code, Equals, http.StatusOK) 185 return n 186 } 187 188 func (t *NIBPutTest) TestPutReferencedContentMissing(c *C) { 189 n := t.addTestNIB(c) 190 n = t.changeNIBForPut(c, n) 191 192 t.req = t.requestWithNib(c, n) 193 t.signRequest() 194 195 resp := t.getResponse(t.req) 196 c.Assert(resp.Code, Equals, http.StatusPreconditionFailed) 197 data, err := ioutil.ReadAll(resp.Body) 198 c.Assert(err, IsNil) 199 200 jsonError := &api.ContentIDsJSONError{} 201 err = json.Unmarshal(data, jsonError) 202 c.Assert(err, IsNil) 203 for _, objectID := range n.AllObjectIDs() { 204 helpers.SliceContainsString(jsonError.MissingContentIDs, objectID) 205 } 206 }