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  }