import unittest
import os
from blinker import signal
from utils import flash_checker
from time import sleep

TEST_FLASH_FILE = os.path.join('.','test_data','flash')

class TestFlashChecker(unittest.TestCase):
    def setUp(self):
        self.notified = False
        signal("box_flash_detected").connect(self._flash_notify)
        self.test_checker = flash_checker.FlashChecker(TEST_FLASH_FILE)

    def tearDown(self):
        if os.path.exists(TEST_FLASH_FILE):
            os.remove(TEST_FLASH_FILE)

    def _flash_notify(self, sender):
        self.notified = True

    def test_no_flash(self):
        self.test_checker.check_flash_file()
        self.assertFalse(self.notified)
        self.assertFalse(self.test_checker.flash_state)

    def test_flash_ok_and_remove(self):
        with open(TEST_FLASH_FILE, "w") as flash_file:
            flash_file.write(flash_checker.FLASH_STATE_SUCCESSFUL)
        self.test_checker.check_flash_file()
        self.assertTrue(self.notified)
        self.assertEqual(self.test_checker.flash_state, flash_checker.FLASH_STATE_SUCCESSFUL)

        self.notified = False
        self.test_checker.remove_flash_file()
        self.assertFalse(self.notified)
        self.assertFalse(self.test_checker.flash_state)
        self.assertFalse(os.path.exists(TEST_FLASH_FILE))

    def test_flash_ko(self):
        with open(TEST_FLASH_FILE, "w") as flash_file:
            flash_file.write(flash_checker.FLASH_STATE_UNSUCCESSFUL)
        self.test_checker.check_flash_file()
        self.assertTrue(self.notified)
        self.assertEqual(self.test_checker.flash_state, flash_checker.FLASH_STATE_UNSUCCESSFUL)