def test_get_all_products(self): result = get(UserTable, self.session) self._assert_result(result, [self.p1_history[-1], self.p2_history[-1], self.p3_history[-1]]) result = get(UserTable, self.session, t1=datetime.utcfromtimestamp(31)) self._assert_result(result, [self.p1_history[2], self.p2_history[0], self.p3_history[0]]) result = get(UserTable, self.session, t1=datetime.utcfromtimestamp(11)) self._assert_result(result, [self.p1_history[0], self.p3_history[0]]) result = get( UserTable, self.session, t1=datetime.utcfromtimestamp(11), t2=datetime.utcfromtimestamp(45), ) self._assert_result(result, list(chain(self.p1_history[1:], self.p2_history)))
def test_get_products_after_va_id(self): result = get( UserTable, self.session, va_id=3, ) self._assert_result(result, [ self.p1_history[1], self.p1_history[2], self.p1_history[3], self.p2_history[1] ])
def test_get_multiple_products(self): conds = [{'product_id': 10}, {'product_id': 11}] result = get(UserTable, self.session, conds=conds) self._assert_result(result, [self.p1_history[-1], self.p2_history[-1]]) result = get(UserTable, self.session, t1=datetime.utcfromtimestamp(15), conds=conds) self._assert_result(result, self.p1_history[:1]) result = get(UserTable, self.session, t1=datetime.utcfromtimestamp(25), conds=conds) self._assert_result(result, [self.p1_history[1], self.p2_history[0]]) result = get( UserTable, self.session, t1=datetime.utcfromtimestamp(11), t2=datetime.utcfromtimestamp(45), conds=conds, ) self._assert_result(result, list(chain(self.p1_history[1:], self.p2_history)))
def test_failure_conditions(self): ''' Pass invalid conds arguments and ensure the query fails. ''' conds = [{'product_id': 10, 'foo': 15}] with self.assertRaises(ValueError): get(UserTable, self.session, t1=datetime.utcfromtimestamp(31), conds=conds) conds = [{'pid': 10}] with self.assertRaises(ValueError): get(UserTable, self.session, t1=datetime.utcfromtimestamp(31), conds=conds) with self.assertRaises(ValueError): get(UserTable, self.session, page=-10)
def test_get_single_product_no_change(self): ''' Performs a query for p3 which has no changes for current time, previous time slice, a time period that includes t1, and a time period that does not include t1. ''' conds = [{'product_id': 2546}] result = get(UserTable, self.session, conds=conds) self._assert_result(result, self.p3_history) result = get( UserTable, self.session, t1=datetime.utcfromtimestamp(5), conds=conds, ) self.assertEquals(len(result), 0) result = get( UserTable, self.session, t1=datetime.utcfromtimestamp(15), conds=conds, ) self._assert_result(result, self.p3_history) result = get( UserTable, self.session, t1=self.t1, conds=conds, ) self._assert_result(result, self.p3_history) result = get( UserTable, self.session, t1=datetime.utcfromtimestamp(5), t2=datetime.utcfromtimestamp(11), conds=conds, ) self._assert_result(result, self.p3_history) result = get( UserTable, self.session, t1=datetime.utcfromtimestamp(11), t2=datetime.utcfromtimestamp(15), conds=conds, ) self.assertEquals(len(result), 0)
def test_get_single_product_with_change(self): ''' Performs a query for p1 which has been changed 3 times for current time, previous time slices, and various time periods. ''' conds = [{'product_id': 10}] result = get(UserTable, self.session, conds=conds) self._assert_result(result, self.p1_history[-1:]) result = get(UserTable, self.session, t1=datetime.utcfromtimestamp(15), conds=conds) self._assert_result(result, self.p1_history[:1]) result = get( UserTable, self.session, t1=datetime.utcfromtimestamp(35), conds=conds, ) self._assert_result(result, self.p1_history[2:3]) result = get( UserTable, self.session, t2=datetime.utcfromtimestamp(35), conds=conds, ) self._assert_result(result, self.p1_history[:3]) result = get( UserTable, self.session, t1=datetime.utcfromtimestamp(11), t2=datetime.utcfromtimestamp(45), conds=conds, ) self._assert_result(result, self.p1_history[1:]) result = get( UserTable, self.session, t1=datetime.utcfromtimestamp(11), t2=datetime.utcfromtimestamp(35), conds=conds, ) self._assert_result(result, self.p1_history[1:3])
def test_paging_results(self): self.session.execute('delete from {}'.format(UserTable.__tablename__)) self.session.execute('delete from {}'.format(ArchiveTable.__tablename__)) t = datetime.utcfromtimestamp(10000) with mock.patch('versionalchemy.models.datetime') as p: p.now.return_value = t history = [] self.p1['col2'] = 0 p1 = UserTable(**self.p1) self.session.add(p1) self.session.commit() history.append(self._history(p1, t, self.p1['col2'])) # make 500 changes for i in xrange(500): self.p1['col2'] += 1 self.p1['col3'] = int(i < 250) self.p1['col1'] = 'foobar' + '1' * ((i + 1) / 10) [setattr(p1, k, v) for k, v in self.p1.iteritems()] self.session.add(p1) self.session.commit() history.append(self._history(p1, t, self.p1['col2'])) result = get( UserTable, self.session, t1=datetime.utcfromtimestamp(0), t2=datetime.utcfromtimestamp(10000000000), page=1, page_size=1000, ) self._assert_result(result, history) result = get( UserTable, self.session, t1=datetime.utcfromtimestamp(0), t2=datetime.utcfromtimestamp(10000000000), page=1, page_size=100 ) self._assert_result(result, history[:100]) result = get( UserTable, self.session, t1=datetime.utcfromtimestamp(0), t2=datetime.utcfromtimestamp(10000000000), page=3, page_size=100 ) self._assert_result(result, history[200:300]) result = get( UserTable, self.session, t1=datetime.utcfromtimestamp(0), t2=datetime.utcfromtimestamp(10000000000), page=5, page_size=100 ) self._assert_result(result, history[400:500]) result = get( UserTable, self.session, t1=datetime.utcfromtimestamp(0), t2=datetime.utcfromtimestamp(10000000000), fields=['col1'], page=1, page_size=80 ) self._assert_result(result, history[0:80:10], fields=['col1'])
def test_fields_query(self): ''' Test specifying fields and make sure dedup happens correctly. ''' def prune_data(d, fields): return {k: d[k] for k in fields} conds = [{'product_id': 10}] fields = ['col2'] result = get( UserTable, self.session, t1=datetime.utcfromtimestamp(9), t2=datetime.utcfromtimestamp(45), conds=conds, fields=fields, ) expected = [self.p1_history[0], self.p1_history[3]] self._assert_result(result, expected, fields=fields) fields = ['col1', 'col2'] result = get( UserTable, self.session, t1=datetime.utcfromtimestamp(9), t2=datetime.utcfromtimestamp(45), conds=conds, fields=fields, ) self._assert_result(result, self.p1_history, fields=fields) fields = ['col1'] result = get( UserTable, self.session, t1=datetime.utcfromtimestamp(9), t2=datetime.utcfromtimestamp(45), fields=fields, ) self._assert_result( result, list(chain(self.p1_history[:3], self.p2_history[:1], self.p3_history)), fields=fields, ) fields = ['col1', 'col2'] result = get( UserTable, self.session, t1=datetime.utcfromtimestamp(11), conds=conds, fields=fields, ) self._assert_result(result, self.p1_history[:1], fields=fields) fields = ['col1', 'col2'] result = get( UserTable, self.session, conds=conds, fields=fields, ) self._assert_result(result, self.p1_history[-1:], fields=fields) fields = ['col1', 'invalid_col'] result = get( UserTable, self.session, conds=conds, fields=fields, ) self.p1_history[-1]['va_data']['invalid_col'] = None self._assert_result(result, self.p1_history[-1:], fields=fields)