tests.py 5.41 KB
from django.test import TestCase
import os
import shutil
import time
import alert_manager.tasks

from django.conf import settings

from common.models import *

from utils.Logger import *
log = setupLogger("test", "test")

TEST_FILE = "unittest_voevent.xml"

TEST_FILE_PATH = os.path.join(alert_manager.tasks.VOEVENTS_PATH, TEST_FILE)

VOEVENTS_TO_SEND_PATH = "alert_manager/events_to_send"


class TestStrategyChange(TestCase):

    # In /src/misc/ folder !!!
    fixtures = ['tests/alert_mgr_test.json']

    def setUp(self):
        # (EP) BAD !!! Ca ne fonctionne que pcq la fixture ne contient que UNE alerte !!!
        self.alert = Alert.objects.get()
        # Pour info, une alerte n'a pas d'id propre, mais on peut la lire par son Request id:
        #self.alert = Alert.objects.get(pk=65)
        #print("alert read is", self.alert)
        #print("alert request read is", self.alert.request)
        self.strat1 = Alert.objects.get().strategyobs
        self.strat2 = StrategyObs.objects.exclude(id=self.strat1.id)[0]
        #print("strategies are", self.strat1, self.strat2)
        # A quoi ça sert ça, c'est déjà le cas non ???
        self.alert.strategyobs = self.strat1
        self.alert.save()

    def test_change_inexistant_strat(self):
        self.client.login(username="test@test.test", password="test")

        path = "/alert_manager/change_obs_strategy_validate/" + str(self.alert.id)
        response = self.client.post(path, {"strategy_choice": 42})
        self.assertTrue("error" in response.context.keys(), "There should be an error of non existant strategy")

    def test_change_inexistant_alert(self):
        self.client.login(username="test@test.test", password="test")
        path = "/alert_manager/change_obs_strategy_validate/" + str(self.alert.id + 1)
        response = self.client.post(path, {"strategy_choice": self.strat2.id})
        self.assertTrue("error" in response.context.keys(), "There should be an error of non existant alert")

    def test_change_same_strat(self):
        self.client.login(username="test@test.test", password="test")
        path = "/alert_manager/change_obs_strategy_validate/" + str(self.alert.id)
        response = self.client.post(path, {"strategy_choice": self.strat1.id})
        self.assertTrue("error" in response.context.keys(), "There should be an error of changing to same strategy")

    def test_change_all_working(self):
        print("\n===== test_change_all_working =====\n")

        # alert id is 65 with strategy strat1
        print("Alert request read is", self.alert.request)
        print("- its id is the same as its request id, which is", self.alert.id)
        print("- its current strategy is", self.alert.strategyobs)

        # strat1 and strat2
        print("Strategies available in fixture are", self.strat1, self.strat2)

        self.client.login(username="test@test.test", password="test")

        # change strategy to strat2
        path = "/alert_manager/change_obs_strategy_validate/" + str(self.alert.id)
        # call view alert_manager.views.change_obs_strategy_validate(65)
        response = self.client.post(path, {"strategy_choice": self.strat2.id})
        self.assertFalse("error" in response.context.keys(), "There shouldn't be an error")
        self.assertEqual(Alert.objects.count(), 2, "There should be 2 alerts after the strategy change")
        new_alert = Alert.objects.exclude(id=self.alert.id)[0]
        self.assertEqual(new_alert.strategyobs.id, self.strat2.id, "The new alert should have the 'strat2' strategy")

# OBSOLETE
# class AlertListenerTestsCelery(TestCase):
#     '''
#         IMPORTANT : As soon as you do a DB request in a test, the test DB will no longer be synchronized with the DB used by celery
#                     I have no idea why (Paul), but any call to the DB must be done in setup or after all celery actions are finished
#     '''
#
#     def test_alert_reception(self):
#         '''
#             Must be launched with scripts/celery_test.sh
#             Copy a VOEvent file in the events_received directory to start the workflow
#             Tests if the alert and children are well created
#         '''
#
#
#         if os.path.isfile(TEST_FILE_PATH):
#             os.remove(TEST_FILE_PATH)
#             print("================== DELETE FILE ==================")
#             time.sleep(3)
#
#         print("================== COPY FILE ==================")
#         shutil.copyfile(os.path.join(VOEVENTS_TO_SEND_PATH, TEST_FILE),
#                         TEST_FILE_PATH)
#         time.sleep(4)
#
#         self.assertEqual(Alert.objects.count(), 1)
#         alert = Alert.objects.all()[0]
#         self.assertEqual(alert.author, "ivo://nasa.gsfc.tan/gcn")
#         self.assertEqual(alert.burst_ra, 74.7412)
#         self.assertEqual(alert.burst_dec, 25.3137)
#         self.assertEqual(alert.trig_id, 532871)
#         self.assertEqual(alert.editor, "61")
#         self.assertEqual(alert.pkt_ser_num, 1)
# 
#         self.assertEqual(Request.objects.count(), 1)
#         self.assertEqual(Sequence.objects.count(), 2)
#         self.assertEqual(Album.objects.count(), 3)
#         self.assertEqual(Plan.objects.count(), 6)
#
#
#
#     def test_basic(self):
#         '''
#             Used to test scripts/celery_test.sh
#             Only work if the initial_fixture is on the celery test DB (an only it)
#         '''
#         Country.objects.create(name="TEEEEST")
#         self.assertEqual(Country.objects.count(), 2, "should be 2 countries")