def test_it_bails_out_when_no_item_is_found(self): fs = self.mox.CreateMock(DataStoreFS) ds = DataStore(fs) fs.listfiles('my-id').AndReturn([ os.path.join('my-id', 'readme.txt') ]) self.mox.ReplayAll() self.assertRaises(DataStoreException, ds.get, 'my-id') self.mox.VerifyAll()
def test_it_fails_when_two_concurrent_puts_happen(self): fs = self.mox.CreateMock(DataStoreFS) ds = DataStore(fs) fp = os.path.join('my-id', 'item-32.json') fs.open_new_file(fp).AndReturn(closing(BytesIO())) fs.open_new_file(fp).AndRaise(FileAlreadyExistsException('file already exists')) self.mox.ReplayAll() ds.put('item', 'my-id', dict(name='hello', version=31)) self.assertRaises( ConcurrentModificationException, ds.put, 'item', 'my-id', dict(name='hello', version=31) ) self.mox.VerifyAll()
def test_it_queries_the_filesystem_for_the_latest_version(self): fs = self.mox.CreateMock(DataStoreFS) ds = DataStore(fs) pj = os.path.join fs.listfiles('my-id').AndReturn([ pj('my-id', 'item-0.json'), pj('my-id', 'item-15.json'), pj('my-id', 'item-1.json'), pj('my-id', 'item-6.json'), pj('my-id', 'readme.txt'), ]) fs.open_for_reading(os.path.join('my-id', 'item-15.json')).AndReturn( closing(BytesIO('{"name":"the_name"}')) ) self.mox.ReplayAll() item = ds.get('my-id') self.assertEquals(dict(name='the_name', version=15), item) self.mox.VerifyAll()
def test_it_creates_a_new_version_on_put(self): fs = self.mox.CreateMock(DataStoreFS) def clock_now(): return datetime(1970, 1, 1) ds = DataStore(fs, clock_now) first_version = os.path.join('my-id', 'item-0.json') fs.listfiles('my-id').AndReturn([ first_version ]) fs.open_for_reading(first_version).AndReturn( closing(BytesIO('{"name":"the name"}')) ) new_version = os.path.join('my-id', 'item-1.json') new_content = BytesIO() @contextmanager def not_closing_content(): yield new_content fs.open_new_file(new_version).AndReturn( not_closing_content() ) self.mox.ReplayAll() item = ds.get('my-id') item['name'] = 'the new name' ds.put('item', 'my-id', item) self.assertEquals( json.loads(new_content.getvalue()), dict( name='the new name', version=1, creation_date={ '__datetime__': True, 'iso8601': '19700101T000000' } ) ) self.mox.VerifyAll()
def test_it_bails_out_when_item_cannot_be_read(self): fs = self.mox.CreateMock(DataStoreFS) ds = DataStore(fs) fs.listfiles('my-id').AndReturn([ os.path.join('my-id', 'item-0.json') ]) fs.open_for_reading(os.path.join('my-id', 'item-0.txt')).AndRaise( Exception() ) self.mox.ReplayAll() self.assertRaises(DataStoreException, ds.get, 'my-id') self.mox.VerifyAll()
def test_it_can_list_all_ids(self): fs = self.mox.CreateMock(DataStoreFS) ds = DataStore(fs) items = [ os.path.join('item1', 'item-1.json'), os.path.join('item2', 'item-5.json') ] fs.listdirs().AndReturn(['__temp', 'item1', 'item2']) fs.listfiles('item1').AndReturn([items[0]]) fs.open_for_reading(items[0]).AndReturn( closing(BytesIO('{"name":"a"}')) ) fs.listfiles('item2').AndReturn([items[1]]) fs.open_for_reading(items[1]).AndReturn( closing(BytesIO('{"name":"b"}')) ) self.mox.ReplayAll() self.assertEquals(set(['item1', 'item2']), set(ds.all_ids())) self.mox.VerifyAll()