github.com/hoffie/larasync@v0.0.0-20151025221940-0384d2bddcef/api/server/nibList_test.go (about) 1 package server 2 3 import ( 4 "bytes" 5 "io" 6 "net/http" 7 "sort" 8 "strconv" 9 10 . "gopkg.in/check.v1" 11 12 "github.com/hoffie/larasync/helpers/bincontainer" 13 "github.com/hoffie/larasync/helpers/crypto" 14 "github.com/hoffie/larasync/repository/nib" 15 ) 16 17 type NIBListTest struct { 18 NIBTest 19 } 20 21 var _ = Suite(&NIBListTest{getNIBTest()}) 22 23 func (t *NIBListTest) SetUpTest(c *C) { 24 t.NIBTest.SetUpTest(c) 25 t.createRepository(c) 26 } 27 28 func (t *NIBListTest) createNibList(c *C) []*nib.NIB { 29 nibs := []*nib.NIB{} 30 for i := 0; i < 10; i++ { 31 t.setNIBId( 32 strconv.FormatInt(int64(i), 10), 33 ) 34 nibs = append(nibs, t.addTestNIB(c)) 35 } 36 return nibs 37 } 38 39 func (t *NIBListTest) TestUnauthorized(c *C) { 40 resp := t.getResponse(t.req) 41 c.Assert(resp.Code, Equals, http.StatusUnauthorized) 42 } 43 44 func (t *NIBListTest) TestRepositoryNotExisting(c *C) { 45 t.repositoryName = "does-not-exist" 46 t.req = t.requestEmptyBody(c) 47 t.signRequest() 48 resp := t.getResponse(t.req) 49 c.Assert(resp.Code, Equals, http.StatusUnauthorized) 50 } 51 52 func (t *NIBListTest) TestGetCode(c *C) { 53 t.signRequest() 54 resp := t.getResponse(t.req) 55 c.Assert(resp.Code, Equals, http.StatusOK) 56 } 57 58 func (t *NIBListTest) TestGetEmpty(c *C) { 59 t.signRequest() 60 resp := t.getResponse(t.req) 61 decoder := bincontainer.NewDecoder(resp.Body) 62 63 _, err := decoder.ReadChunk() 64 c.Assert(err, Equals, io.EOF) 65 } 66 67 func AssertNibSetsEqual( 68 c *C, 69 storedNibs []*nib.NIB, 70 retrievedNibs []*nib.NIB, 71 ) { 72 c.Assert( 73 len(storedNibs), Equals, len(retrievedNibs), 74 ) 75 76 nibIds := func(nibs []*nib.NIB) []string { 77 nibIds := make([]string, len(nibs)) 78 for i, n := range nibs { 79 nibIds[i] = n.ID 80 } 81 return nibIds 82 } 83 84 sortedNibIds := func(nibs []*nib.NIB) []string { 85 ids := nibIds(nibs) 86 sort.Sort(sort.StringSlice(ids)) 87 return ids 88 } 89 90 storedNibIds := sortedNibIds(storedNibs) 91 retrievedNibIds := sortedNibIds(retrievedNibs) 92 93 c.Assert(retrievedNibIds, DeepEquals, storedNibIds) 94 95 } 96 97 func (t *NIBListTest) nibFromContainer(c *C, data []byte) *nib.NIB { 98 reader, err := crypto.NewVerifyingReader(t.pubKey, bytes.NewReader(data)) 99 c.Assert(err, IsNil) 100 101 n := nib.NIB{} 102 _, err = n.ReadFrom(reader) 103 c.Assert(err, IsNil) 104 105 c.Assert(reader.VerifyAfterRead(), Equals, true) 106 107 return &n 108 } 109 110 func (t *NIBListTest) getNIBsFromReader(c *C, reader io.Reader) []*nib.NIB { 111 decoder := bincontainer.NewDecoder(reader) 112 113 nibs := []*nib.NIB{} 114 for { 115 data, err := decoder.ReadChunk() 116 117 if err != nil && err != io.EOF { 118 c.Error(err) 119 break 120 } else if err == io.EOF { 121 break 122 } 123 nibs = append(nibs, t.nibFromContainer(c, data)) 124 } 125 126 return nibs 127 } 128 129 func (t *NIBListTest) TestGetAll(c *C) { 130 nibs := t.createNibList(c) 131 t.signRequest() 132 resp := t.getResponse(t.req) 133 134 AssertNibSetsEqual(c, nibs, t.getNIBsFromReader(c, resp.Body)) 135 136 } 137 138 func (t *NIBListTest) TestGetFromTransactionId(c *C) { 139 nibs := t.createNibList(c) 140 141 rep := t.getRepository(c) 142 transaction, err := rep.CurrentTransaction() 143 c.Assert(err, IsNil) 144 145 fromTransactionID := strconv.FormatInt(transaction.PreviousID, 10) 146 t.urlParams.Add("from-transaction-id", fromTransactionID) 147 t.req = t.requestEmptyBody(c) 148 t.signRequest() 149 resp := t.getResponse(t.req) 150 151 c.Assert(resp.Code, Equals, http.StatusOK) 152 153 AssertNibSetsEqual( 154 c, 155 []*nib.NIB{nibs[len(nibs)-1]}, 156 t.getNIBsFromReader(c, resp.Body), 157 ) 158 159 } 160 161 // It should have a current transaction id header. 162 func (t *NIBListTest) TestCurrentTransactionIDHeader(c *C) { 163 t.createNibList(c) 164 t.signRequest() 165 resp := t.getResponse(t.req) 166 167 rep := t.getRepository(c) 168 transaction, err := rep.CurrentTransaction() 169 c.Assert(err, IsNil) 170 171 c.Assert( 172 resp.Header().Get("X-Current-Transaction-Id"), 173 Equals, 174 strconv.FormatInt(transaction.ID, 10), 175 ) 176 } 177 178 // It should not have a transaction id if no transaction exists yet in the 179 // repository. 180 func (t *NIBListTest) TestNoCurrentTransactionIDHeader(c *C) { 181 t.signRequest() 182 resp := t.getResponse(t.req) 183 184 c.Assert( 185 resp.Header().Get("X-Current-Transaction-Id"), 186 Equals, 187 "", 188 ) 189 }