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 }