class KarmaAPITests(TestCase): client_class = LocalizingClient @mock.patch.object(waffle, 'switch_is_active') def setUp(self, switch_is_active): switch_is_active.return_value = True super(KarmaAPITests, self).setUp() try: self.mgr = KarmaManager() redis_client('karma').flushdb() except RedisError: raise SkipTest self.user1 = user(save=True) self.user2 = user(save=True) self.user3 = user(save=True) TestAction1(user=self.user1).save() TestAction2(user=self.user2).save() TestAction2(user=self.user2).save() TestAction1(user=self.user3).save() TestAction1(user=self.user3).save() TestAction1(user=self.user3).save() self.mgr.update_top() self.client.login(username=self.user1.username, password='******') add_permission(self.user1, models.Title, 'view_dashboard') @mock.patch.object(waffle, 'switch_is_active') def test_user_api_no_permission(self, switch_is_active): """No view_dashboard permission? No API for you.""" switch_is_active.return_value = True self.client.login(username=self.user2.username, password='******') url = reverse('karma.api.users') response = self.client.get(url) eq_(403, response.status_code) @mock.patch.object(waffle, 'switch_is_active') def test_user_api_default(self, switch_is_active): """Test user API with all defaults.""" switch_is_active.return_value = True url = reverse('karma.api.users') response = self.client.get(url) eq_(200, response.status_code) r = json.loads(response.content) user_ids = [u[0] for u in r['results']] eq_([self.user2.id, self.user3.id, self.user1.id], user_ids) @mock.patch.object(waffle, 'switch_is_active') def test_user_api_sort_testaction1(self, switch_is_active): """Test user API with sort = TestAction1.""" switch_is_active.return_value = True url = reverse('karma.api.users') url = urlparams(url, sort=TestAction1.action_type) response = self.client.get(url) eq_(200, response.status_code) r = json.loads(response.content) user_ids = [u[0] for u in r['results']] eq_([self.user3.id, self.user1.id], user_ids) @mock.patch.object(waffle, 'switch_is_active') def test_user_api_sort_testaction2(self, switch_is_active): """Test user API with sort = TestAction2.""" switch_is_active.return_value = True url = reverse('karma.api.users') url = urlparams(url, sort=TestAction2.action_type) response = self.client.get(url) eq_(200, response.status_code) r = json.loads(response.content) user_ids = [u[0] for u in r['results']] eq_([self.user2.id], user_ids) @mock.patch.object(waffle, 'switch_is_active') def test_user_api_last_activity(self, switch_is_active): """Verify the last activity field.""" switch_is_active.return_value = True now = datetime.now() one_day = now - timedelta(days=1) two_days = now - timedelta(days=2) answer(creator=self.user1, created=now, save=True) answer(creator=self.user2, created=one_day, save=True) answer(creator=self.user3, created=two_days, save=True) url = reverse('karma.api.users') response = self.client.get(url) eq_(200, response.status_code) r = json.loads(response.content) days_since_last_activity = [u[2] for u in r['results']] eq_([1, 2, 0], days_since_last_activity) @mock.patch.object(waffle, 'switch_is_active') def test_overview_api(self, switch_is_active): """Test overview API.""" switch_is_active.return_value = True url = reverse('karma.api.overview') url = urlparams(url, daterange='6m') response = self.client.get(url) eq_(200, response.status_code) r = json.loads(response.content) overview = r['overview'] eq_(4, overview['test-action-1']) eq_(2, overview['test-action-2'])
class KarmaManagerTests(TestCase): @mock.patch.object(waffle, 'switch_is_active') def setUp(self, switch_is_active): switch_is_active.return_value = True super(KarmaManagerTests, self).setUp() try: self.mgr = KarmaManager() redis_client('karma').flushdb() except RedisError: raise SkipTest self.user1 = user(save=True) self.user2 = user(save=True) self.user3 = user(save=True) today = date.today() # user1 actions (3 + 3 + 7): TestAction1(user=self.user1, day=today).save() TestAction1(user=self.user1, day=today).save() TestAction2(user=self.user1, day=today).save() # user2 actions (3 + 7 + 7): TestAction1(user=self.user2, day=today - timedelta(days=8)).save() TestAction2(user=self.user2, day=today - timedelta(days=32)).save() TestAction2(user=self.user2, day=today - timedelta(days=360)).save() # user3 actions (3 + 3 + 3 + 7): TestAction1(user=self.user3, day=today - timedelta(days=10)).save() TestAction1(user=self.user3, day=today - timedelta(days=40)).save() TestAction1(user=self.user3, day=today - timedelta(days=190)).save() TestAction2(user=self.user3, day=today - timedelta(days=3)).save() @mock.patch.object(waffle, 'switch_is_active') def test_count(self, switch_is_active): """Test count method.""" switch_is_active.return_value = True self.mgr.update_top() eq_(13, self.mgr.count('all', self.user1, type='points')) eq_(2, self.mgr.count('all', self.user1, type=TestAction1.action_type)) eq_(1, self.mgr.count('all', self.user1, type=TestAction2.action_type)) eq_(0, self.mgr.count('1w', self.user2, type='points')) eq_(3, self.mgr.count('1m', self.user2, type='points')) eq_(2, self.mgr.count('1y', self.user2, type=TestAction2.action_type)) eq_(2, self.mgr.count('6m', self.user3, type=TestAction1.action_type)) @mock.patch.object(waffle, 'switch_is_active') def test_top_users(self, switch_is_active): """Test top_users method.""" switch_is_active.return_value = True self.mgr.update_top() u1, u2, u3 = self.user1, self.user2, self.user3 eq_([u3, u1, u2], self.mgr.top_users('3m')) eq_([u3, u1, u2], self.mgr.top_users('all', type=TestAction1.action_type)) eq_([u3, u1, u2], self.mgr.top_users('all', type=TestAction1.action_type)) eq_([u1], self.mgr.top_users('1w', type=TestAction1.action_type)) eq_([u1, u3], self.mgr.top_users(daterange='1w')) @mock.patch.object(waffle, 'switch_is_active') def test_ranking(self, switch_is_active): """Test ranking method.""" switch_is_active.return_value = True self.mgr.update_top() eq_(1, self.mgr.ranking('all', self.user2)) eq_(3, self.mgr.ranking('all', self.user1)) eq_(1, self.mgr.ranking('1w', self.user1)) eq_(1, self.mgr.ranking('all', self.user3, type=TestAction1.action_type)) @mock.patch.object(waffle, 'switch_is_active') def test_recalculate_points(self, switch_is_active): """Test the recalculate_points method.""" switch_is_active.return_value = True # Create Points with new point values. p1 = Points.objects.create(action='test-action-1', points=15) Points.objects.create(action='test-action-2', points=12) self.mgr.recalculate_points(self.user1) eq_(42, self.mgr.count('all', self.user1, type='points')) # Update one of the Point values. p1.points = 30 p1.save() self.mgr.recalculate_points(self.user1) eq_(72, self.mgr.count('all', self.user1, type='points')) @mock.patch.object(waffle, 'switch_is_active') def test_overview_counts(self, switch_is_active): """Verify the overview counts are correct.""" switch_is_active.return_value = True self.mgr.update_top() eq_(46, self.mgr.count('all', type='points')) eq_(6, self.mgr.count('all', type=TestAction1.action_type)) eq_(4, self.mgr.count('all', type=TestAction2.action_type)) eq_(2, self.mgr.count('1w', type=TestAction1.action_type)) eq_(2, self.mgr.count('1m', type=TestAction2.action_type)) eq_(3, self.mgr.count('6m', type=TestAction2.action_type)) eq_(2, self.mgr.day_count(type=TestAction1.action_type)) eq_(1, self.mgr.day_count(type=TestAction2.action_type))