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  }