github.com/hoffie/larasync@v0.0.0-20151025221940-0384d2bddcef/repository/transactionContainerManager_test.go (about)

     1  package repository
     2  
     3  import (
     4  	"os"
     5  
     6  	"github.com/hoffie/larasync/repository/content"
     7  
     8  	. "gopkg.in/check.v1"
     9  )
    10  
    11  type TransactionContainerManagerTest struct {
    12  	dir string
    13  	tcm *TransactionContainerManager
    14  }
    15  
    16  var _ = Suite(&TransactionContainerManagerTest{})
    17  
    18  func (t *TransactionContainerManagerTest) SetUpTest(c *C) {
    19  	t.dir = c.MkDir()
    20  	storage := content.NewFileStorage(t.dir)
    21  
    22  	t.tcm = newTransactionContainerManager(storage, t.dir)
    23  }
    24  
    25  // It should return an empty string if there is no current uuid in the
    26  // repository.
    27  func (t *TransactionContainerManagerTest) TestEmptyCurrentUUID(c *C) {
    28  	currentUUID, err := t.tcm.currentTransactionContainerUUID()
    29  	c.Assert(err, IsNil)
    30  	c.Assert(currentUUID, Equals, "")
    31  }
    32  
    33  // It should create a new container without any other container being
    34  // created yet if the current container is requested.
    35  func (t *TransactionContainerManagerTest) TestNewContainerCreation(c *C) {
    36  	transactionContainer, err := t.tcm.CurrentTransactionContainer()
    37  	c.Assert(err, IsNil)
    38  	c.Assert(transactionContainer.UUID, Not(Equals), "")
    39  	c.Assert(transactionContainer.PreviousUUID, Equals, "")
    40  	c.Assert(transactionContainer.Transactions, HasLen, 0)
    41  }
    42  
    43  // It should add the new transaction manager to the repository if it is initially
    44  // created via the CurrentTransactionContainer method.
    45  func (t *TransactionContainerManagerTest) TestNewContainerAddition(c *C) {
    46  	transactionContainer, err := t.tcm.CurrentTransactionContainer()
    47  	c.Assert(err, IsNil)
    48  	exists := t.tcm.Exists(transactionContainer.UUID)
    49  	c.Assert(exists, Equals, true)
    50  }
    51  
    52  // It should return the same container if the CurrentTransactionContainer is querried
    53  // twice.
    54  func (t *TransactionContainerManagerTest) TestNewContainerStorage(c *C) {
    55  	transactionContainer, err := t.tcm.CurrentTransactionContainer()
    56  	c.Assert(err, IsNil)
    57  
    58  	otherTransactionContainer, err := t.tcm.CurrentTransactionContainer()
    59  	c.Assert(err, IsNil)
    60  	c.Assert(transactionContainer.UUID, Equals, otherTransactionContainer.UUID)
    61  }
    62  
    63  // It should always return the newest set containerStorage as the current one.
    64  func (t *TransactionContainerManagerTest) TestCreateNew(c *C) {
    65  	transactionContainer, err := t.tcm.CurrentTransactionContainer()
    66  	c.Assert(err, IsNil)
    67  
    68  	newContainer, err := t.tcm.NewContainer()
    69  	c.Assert(err, IsNil)
    70  
    71  	transactionContainer, err = t.tcm.CurrentTransactionContainer()
    72  
    73  	c.Assert(newContainer.UUID, Equals, transactionContainer.UUID)
    74  }
    75  
    76  func (t *TransactionContainerManagerTest) SetTransactionContainer(c *C) *TransactionContainer {
    77  	transactionContainer := &TransactionContainer{
    78  		UUID:         "testinit",
    79  		Transactions: []*Transaction{},
    80  		PreviousUUID: ""}
    81  	err := t.tcm.Set(transactionContainer)
    82  	c.Assert(err, IsNil)
    83  	return transactionContainer
    84  }
    85  
    86  // It should be able to set a new transactionContainer.
    87  func (t *TransactionContainerManagerTest) TestSet(c *C) {
    88  	t.SetTransactionContainer(c)
    89  }
    90  
    91  // It should always return the newest set entry.
    92  func (t *TransactionContainerManagerTest) TestSetCurrent(c *C) {
    93  	transactionContainer := t.SetTransactionContainer(c)
    94  
    95  	currentTransactionContainer, err := t.tcm.CurrentTransactionContainer()
    96  
    97  	c.Assert(err, IsNil)
    98  	c.Assert(transactionContainer.UUID, Equals, currentTransactionContainer.UUID)
    99  }
   100  
   101  // It should return a FileNotExists if the container is not existing.
   102  func (t *TransactionContainerManagerTest) TestGetNegative(c *C) {
   103  	_, err := t.tcm.Get("doesnotexist")
   104  	c.Assert(os.IsNotExist(err), Equals, true)
   105  }
   106  
   107  func (t *TransactionContainerManagerTest) TestGet(c *C) {
   108  	transactionContainer := t.SetTransactionContainer(c)
   109  	retTransactionContainer, err := t.tcm.Get(transactionContainer.UUID)
   110  	c.Assert(err, IsNil)
   111  	c.Assert(retTransactionContainer.UUID, Equals, transactionContainer.UUID)
   112  }
   113  
   114  func (t *TransactionContainerManagerTest) TestStoreTransaction(c *C) {
   115  	transactionContainer := &TransactionContainer{
   116  		UUID: "testinit",
   117  		Transactions: []*Transaction{
   118  			&Transaction{
   119  				ID:         1,
   120  				NIBIDs:     []string{"a", "b", "c"},
   121  				PreviousID: 0},
   122  			&Transaction{
   123  				ID:         2,
   124  				NIBIDs:     []string{"d", "e", "f"},
   125  				PreviousID: 1}},
   126  		PreviousUUID: ""}
   127  	err := t.tcm.Set(transactionContainer)
   128  	c.Assert(err, IsNil)
   129  
   130  	retTransactionContainer, err := t.tcm.Get(transactionContainer.UUID)
   131  	c.Assert(err, IsNil)
   132  
   133  	c.Assert(retTransactionContainer.UUID, Equals, transactionContainer.UUID)
   134  	c.Assert(len(retTransactionContainer.Transactions), Equals, 2)
   135  
   136  	for index, transaction := range retTransactionContainer.Transactions {
   137  		checkTransaction := transactionContainer.Transactions[index]
   138  		c.Assert(transaction.ID, Equals, checkTransaction.ID)
   139  		c.Assert(transaction.NIBIDs, DeepEquals, checkTransaction.NIBIDs)
   140  		c.Assert(transaction.PreviousID, Equals, checkTransaction.PreviousID)
   141  	}
   142  }
   143  
   144  // It should raise an error if the ID of a Transaction in the container
   145  // is set to 0.
   146  func (t *TransactionContainerManagerTest) TestStoreTransactionIDZero(c *C) {
   147  	transactionContainer := &TransactionContainer{
   148  		UUID: "testinit",
   149  		Transactions: []*Transaction{
   150  			&Transaction{
   151  				ID:         0,
   152  				NIBIDs:     []string{"a", "b", "c"},
   153  				PreviousID: 0,
   154  			},
   155  		},
   156  		PreviousUUID: ""}
   157  
   158  	err := t.tcm.Set(transactionContainer)
   159  	c.Assert(err, NotNil)
   160  }
   161  
   162  // It should not be able to set a Transaction which does not any NIBUUIDs stored.
   163  func (t *TransactionContainerManagerTest) TestStoreTransactionEmptyNIBID(c *C) {
   164  	transactionContainer := &TransactionContainer{
   165  		UUID: "testinit",
   166  		Transactions: []*Transaction{
   167  			&Transaction{
   168  				ID:         1,
   169  				NIBIDs:     []string{},
   170  				PreviousID: 0,
   171  			},
   172  		},
   173  		PreviousUUID: ""}
   174  
   175  	err := t.tcm.Set(transactionContainer)
   176  	c.Assert(err, NotNil)
   177  }
   178  
   179  // It should return False if the given entry does not exist.
   180  func (t *TransactionContainerManagerTest) TestExistsNegative(c *C) {
   181  	c.Assert(t.tcm.Exists("testinit"), Equals, false)
   182  }
   183  
   184  // It should return True if the given entry does exist.
   185  func (t *TransactionContainerManagerTest) TestExistsPositive(c *C) {
   186  	t.SetTransactionContainer(c)
   187  	c.Assert(t.tcm.Exists("testinit"), Equals, true)
   188  }