# -*- coding:utf-8 -* # # Copyright 2023 # - Skia # # Ce fichier fait partie du site de l'Association des Étudiants de l'UTBM, # http://ae.utbm.fr. # # This program is free software; you can redistribute it and/or modify it under # the terms of the GNU General Public License a published by the Free Software # Foundation; either version 3 of the License, or (at your option) any later # version. # # This program is distributed in the hope that it will be useful, but WITHOUT # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS # FOR A PARTICULAR PURPOSE. See the GNU General Public License for more # details. # # You should have received a copy of the GNU General Public License along with # this program; if not, write to the Free Sofware Foundation, Inc., 59 Temple # Place - Suite 330, Boston, MA 02111-1307, USA. # # import json from pathlib import Path from django.core.management import call_command from django.test import TestCase from django.urls import reverse from core.models import User from galaxy.models import Galaxy class GalaxyTestModel(TestCase): def setUp(self): self.root = User.objects.get(username="root") self.skia = User.objects.get(username="skia") self.sli = User.objects.get(username="sli") self.krophil = User.objects.get(username="krophil") self.richard = User.objects.get(username="rbatsbak") self.subscriber = User.objects.get(username="subscriber") self.public = User.objects.get(username="public") self.com = User.objects.get(username="comunity") def test_user_self_score(self): """ Test that individual user scores are correct """ with self.assertNumQueries(8): self.assertEqual(Galaxy.compute_user_score(self.root), 9) self.assertEqual(Galaxy.compute_user_score(self.skia), 10) self.assertEqual(Galaxy.compute_user_score(self.sli), 8) self.assertEqual(Galaxy.compute_user_score(self.krophil), 2) self.assertEqual(Galaxy.compute_user_score(self.richard), 10) self.assertEqual(Galaxy.compute_user_score(self.subscriber), 8) self.assertEqual(Galaxy.compute_user_score(self.public), 8) self.assertEqual(Galaxy.compute_user_score(self.com), 1) def test_users_score(self): """ Test on the default dataset generated by the `populate` command that the relation scores are correct """ expected_scores = { "krophil": { "comunity": {"clubs": 0, "family": 0, "pictures": 0, "score": 0}, "public": {"clubs": 0, "family": 0, "pictures": 0, "score": 0}, "rbatsbak": {"clubs": 100, "family": 0, "pictures": 0, "score": 100}, "subscriber": {"clubs": 0, "family": 0, "pictures": 0, "score": 0}, }, "public": { "comunity": {"clubs": 0, "family": 0, "pictures": 0, "score": 0} }, "rbatsbak": { "comunity": {"clubs": 0, "family": 0, "pictures": 0, "score": 0}, "public": {"clubs": 0, "family": 366, "pictures": 0, "score": 366}, "subscriber": {"clubs": 0, "family": 366, "pictures": 0, "score": 366}, }, "root": { "comunity": {"clubs": 0, "family": 0, "pictures": 0, "score": 0}, "krophil": {"clubs": 0, "family": 0, "pictures": 0, "score": 0}, "public": {"clubs": 0, "family": 0, "pictures": 0, "score": 0}, "rbatsbak": {"clubs": 0, "family": 0, "pictures": 0, "score": 0}, "skia": {"clubs": 0, "family": 732, "pictures": 0, "score": 732}, "sli": {"clubs": 0, "family": 0, "pictures": 0, "score": 0}, "subscriber": {"clubs": 0, "family": 0, "pictures": 0, "score": 0}, }, "skia": { "comunity": {"clubs": 0, "family": 0, "pictures": 0, "score": 0}, "krophil": {"clubs": 114, "family": 0, "pictures": 2, "score": 116}, "public": {"clubs": 0, "family": 0, "pictures": 0, "score": 0}, "rbatsbak": {"clubs": 100, "family": 0, "pictures": 0, "score": 100}, "sli": {"clubs": 0, "family": 366, "pictures": 4, "score": 370}, "subscriber": {"clubs": 0, "family": 0, "pictures": 0, "score": 0}, }, "sli": { "comunity": {"clubs": 0, "family": 0, "pictures": 0, "score": 0}, "krophil": {"clubs": 17, "family": 0, "pictures": 2, "score": 19}, "public": {"clubs": 0, "family": 0, "pictures": 0, "score": 0}, "rbatsbak": {"clubs": 0, "family": 0, "pictures": 0, "score": 0}, "subscriber": {"clubs": 0, "family": 0, "pictures": 0, "score": 0}, }, "subscriber": { "comunity": {"clubs": 0, "family": 0, "pictures": 0, "score": 0}, "public": {"clubs": 0, "family": 0, "pictures": 0, "score": 0}, }, } computed_scores = {} users = [ self.root, self.skia, self.sli, self.krophil, self.richard, self.subscriber, self.public, self.com, ] with self.assertNumQueries(100): while len(users) > 0: user1 = users.pop(0) for user2 in users: score = Galaxy.compute_users_score(user1, user2) u1 = computed_scores.get(user1.username, {}) u1[user2.username] = { "score": sum(score), "family": score.family, "pictures": score.pictures, "clubs": score.clubs, } computed_scores[user1.username] = u1 self.maxDiff = None # Yes, we want to see the diff if any self.assertDictEqual(expected_scores, computed_scores) def test_rule(self): """ Test on the default dataset generated by the `populate` command that the number of queries to rule the galaxy is stable. """ galaxy = Galaxy.objects.create() with self.assertNumQueries(58): galaxy.rule(0) # We want everybody here class GalaxyTestView(TestCase): @classmethod def setUpTestData(cls): """ Generate a plausible Galaxy once for every test """ call_command("generate_galaxy_test_data", "-v", "0") galaxy = Galaxy.objects.create() galaxy.rule(26) # We want a fast test def test_page_is_citizen(self): """ Test that users can access the galaxy page of users who are citizens """ self.client.login(username="root", password="plop") user = User.objects.get(last_name="n°500") response = self.client.get(reverse("galaxy:user", args=[user.id])) self.assertContains( response, f'Reset on {user}', status_code=200, ) def test_page_not_citizen(self): """ Test that trying to access the galaxy page of a user who is not citizens return a 404 """ self.client.login(username="root", password="plop") user = User.objects.get(last_name="n°1") response = self.client.get(reverse("galaxy:user", args=[user.id])) self.assertEquals(response.status_code, 404) def test_full_galaxy_state(self): """ Test on the more complex dataset generated by the `generate_galaxy_test_data` command that the relation scores are correct, and that the view exposes the right data. """ self.client.login(username="root", password="plop") response = self.client.get(reverse("galaxy:data")) state = response.json() galaxy_dir = Path(__file__).parent # Dump computed state, either for easier debugging, or to copy as new reference if changes are legit (galaxy_dir / "test_galaxy_state.json").write_text(json.dumps(state)) self.assertEqual( state, json.loads((galaxy_dir / "ref_galaxy_state.json").read_text()), )