Esempio n. 1
0
class TestSocket(unittest.TestCase):
    """Test cases for `thermod.socket` module."""
    def setUp(self):
        self.lock = asyncio.Condition()

        self.timetable = TimeTable()
        fill_timetable(self.timetable)
        self.timetable.filepath = os.path.join(tempfile.gettempdir(),
                                               'timetable.json')
        self.timetable.save()

        self.heating = BaseHeating()
        self.cooling = BaseCooling()
        self.thermometer = FakeThermometer()

        self.socket = SocketThread(self.timetable, self.heating, self.cooling,
                                   self.thermometer, self.lock)
        self.socket.start()

    def tearDown(self):
        self.socket.stop()
        self.socket.join()
        os.remove(self.timetable.filepath)

    def test_get_settings(self):
        # wrong url
        wrong = requests.get('http://localhost:4345/wrong')
        self.assertEqual(wrong.status_code, 404)
        wrong.close()

        # right url
        r = requests.get(__url_settings__)
        self.assertEqual(r.status_code, 200)
        settings = r.json()
        r.close()

        # check returned settings
        tt = TimeTable()
        tt.__setstate__(settings)
        self.assertEqual(self.timetable, tt)

    def test_get_heating(self):
        # wrong url
        wrong = requests.get('http://localhost:4345/wrong')
        self.assertEqual(wrong.status_code, 404)
        wrong.close()

        # right url
        r = requests.get(__url_heating__)
        self.assertEqual(r.status_code, 200)
        heating = r.json()
        r.close()

        # check returned heating informations
        self.assertEqual(heating['status'], self.heating.status)
        self.assertAlmostEqual(heating['current_temperature'],
                               self.thermometer.temperature,
                               delta=0.1)
        self.assertEqual(heating['target_temperature'],
                         self.timetable.target_temperature())

    def test_post_wrong_messages(self):
        # wrong url
        wrong = requests.post('http://localhost:4345/wrong', {})
        self.assertEqual(wrong.status_code, 404)
        wrong.close()

        # wrong value for status
        wrong = requests.post(__url_settings__,
                              {socket.REQ_SETTINGS_MODE: 'invalid'})
        self.assertEqual(wrong.status_code, 400)
        wrong.close()

        # wrong value (greater then max allowed)
        wrong = requests.post(__url_settings__,
                              {socket.REQ_SETTINGS_DIFFERENTIAL: 1.1})
        self.assertEqual(wrong.status_code, 400)
        wrong.close()

        # wrong JSON data for settings
        settings = self.timetable.__getstate__()
        settings[timetable.JSON_TEMPERATURES][timetable.JSON_TMAX_STR] = 'inf'
        wrong = requests.post(__url_settings__,
                              {socket.REQ_SETTINGS_ALL: settings})
        self.assertEqual(wrong.status_code, 400)
        wrong.close()

        # invalid JSON syntax for settings
        settings = self.timetable.settings()
        wrong = requests.post(__url_settings__,
                              {socket.REQ_SETTINGS_ALL: settings[0:30]})
        self.assertEqual(wrong.status_code, 400)
        wrong.close()

        # check original paramethers
        self.assertAlmostEqual(self.timetable.differential, 0.5, delta=0.01)
        self.assertAlmostEqual(self.timetable.tmax, 21, delta=0.01)

    def test_post_right_messages(self):
        # single settings
        p = requests.post(__url_settings__,
                          {socket.REQ_SETTINGS_MODE: timetable.JSON_MODE_OFF})
        self.assertEqual(p.status_code, 200)
        self.assertEqual(self.timetable.mode, timetable.JSON_MODE_OFF)
        p.close()

        # multiple settings
        q = requests.post(
            __url_settings__, {
                socket.REQ_SETTINGS_MODE: timetable.JSON_MODE_TMAX,
                socket.REQ_SETTINGS_TMAX: 32.3,
                socket.REQ_SETTINGS_GRACE_TIME: 'inf'
            })

        self.assertEqual(q.status_code, 200)
        self.assertEqual(self.timetable.mode, timetable.JSON_MODE_TMAX)
        self.assertAlmostEqual(self.timetable.tmax, 32.3, delta=0.01)
        self.assertEqual(self.timetable.grace_time, float('inf'))
        q.close()

        # some days
        old_set = self.timetable.__getstate__()
        friday = old_set[timetable.JSON_TIMETABLE][timetable.json_get_day_name(
            5)]
        sunday = old_set[timetable.JSON_TIMETABLE][timetable.json_get_day_name(
            7)]

        friday['h12'][0] = 44
        friday['h15'][1] = 45
        sunday['h06'][2] = 46
        sunday['h07'][3] = 47

        # all settings
        tt2 = copy.deepcopy(self.timetable)
        tt2.mode = timetable.JSON_MODE_TMAX
        tt2.grace_time = 3600
        tt2.update('thursday', 4, 1, 36.5)

        self.assertNotEqual(self.timetable, tt2)  # different before update

        s = requests.post(__url_settings__,
                          {socket.REQ_SETTINGS_ALL: tt2.settings()})
        self.assertEqual(s.status_code, 200)
        s.close()

        self.assertEqual(self.timetable, tt2)  # equal after update

    def test_unsupported_http_methods(self):
        pa = requests.patch(__url_settings__, {})
        self.assertEqual(pa.status_code, 501)
        pa.close()

        pu = requests.put(__url_settings__, {})
        self.assertEqual(pu.status_code, 501)
        pu.close()

        de = requests.delete(__url_heating__)
        self.assertEqual(de.status_code, 501)
        de.close()
Esempio n. 2
0
class TestSocket(unittest.TestCase):
    """Test cases for `thermod.socket` module."""
    
    def setUp(self):
        self.loop = asyncio.get_event_loop()
        self.lock = asyncio.Condition()
        
        self.timetable = TimeTable()
        fill_timetable(self.timetable)
        self.timetable.filepath = os.path.join(tempfile.gettempdir(), 'timetable.json')
        self.timetable.save()
        
        self.heating = BaseHeating()
        self.thermometer = FakeThermometer()
        
        self.socket = ControlSocket(self.timetable,
                                    self.heating,
                                    self.thermometer,
                                    'localhost',
                                    4345,  # using different port to run test while real thermod is running
                                    self.lock)
        self.loop.run_until_complete(self.socket.start())
    
    
    def tearDown(self):
        self.loop.run_until_complete(self.socket.stop())
        os.remove(self.timetable.filepath)
    
    
    def test_get_settings(self):
        async def this_test():
            async with aiohttp.ClientSession() as session:
                # wrong url
                async with session.get('http://localhost:4345/wrong') as wrong:
                    self.assertEqual(wrong.status, 404)
                
                # right url
                async with session.get(__url_settings__) as r:
                    self.assertEqual(r.status, 200)
                    settings = await r.json()
                
                # check returned settings
                tt = TimeTable()
                tt.__setstate__(settings)
                self.assertEqual(self.timetable, tt)
        
        self.loop.run_until_complete(this_test())
    
    
    def test_get_heating(self):
        async def this_test():
            async with aiohttp.ClientSession() as session:
                # wrong url
                async with session.get('http://localhost:4345/wrong') as wrong:
                    self.assertEqual(wrong.status, 404)
                
                # right url
                async with session.get(__url_heating__) as r:
                    self.assertEqual(r.status, 200)
                    heating = await r.json()
                
                # check returned heating informations
                self.assertEqual(heating['mode'], self.timetable.mode)
                self.assertEqual(heating['status'], await self.heating.status)
                self.assertAlmostEqual(heating['current_temperature'], await self.thermometer.temperature, delta=0.1)
                self.assertEqual(heating['target_temperature'], self.timetable.target_temperature())
    
        self.loop.run_until_complete(this_test())
    
    
    def test_post_wrong_messages(self):
        async def this_test():
            async with aiohttp.ClientSession() as session:
                # wrong url
                async with session.post('http://localhost:4345/wrong', data={}) as wrong:
                    self.assertEqual(wrong.status, 404)
                
                # wrong value for status
                async with session.post(__url_settings__, data={socket.REQ_SETTINGS_MODE: 'invalid'}) as wrong:
                    self.assertEqual(wrong.status, 400)
                
                # wrong value (greater then max allowed)
                async with session.post(__url_settings__, data={socket.REQ_SETTINGS_DIFFERENTIAL: 1.1}) as wrong:
                    self.assertEqual(wrong.status, 400)
                
                # wrong value (invalid)
                async with session.post(__url_settings__, data={socket.REQ_SETTINGS_HVAC_MODE: 'invalid'}) as wrong:
                    self.assertEqual(wrong.status, 400)
                
                # wrong JSON data for settings
                settings = self.timetable.__getstate__()
                settings[timetable.JSON_TEMPERATURES][timetable.JSON_TMAX_STR] = 'inf'
                async with session.post(__url_settings__, data={socket.REQ_SETTINGS_ALL: settings}) as wrong:
                    self.assertEqual(wrong.status, 400)
                
                # invalid JSON syntax for settings
                settings = self.timetable.settings()
                async with session.post(__url_settings__, data={socket.REQ_SETTINGS_ALL: settings[0:30]}) as wrong:
                    self.assertEqual(wrong.status, 400)
                
                # check original paramethers
                self.assertAlmostEqual(self.timetable.differential, 0.5, delta=0.01)
                self.assertAlmostEqual(self.timetable.tmax, 21, delta=0.01)
        
        self.loop.run_until_complete(this_test())
    
    
    def test_post_right_messages(self):
        async def this_test():
            async with aiohttp.ClientSession() as session:
                # single settings
                async with session.post(__url_settings__, data={socket.REQ_SETTINGS_MODE: timetable.JSON_MODE_OFF}) as p:
                    self.assertEqual(p.status, 200)
                    self.assertEqual(self.timetable.mode, timetable.JSON_MODE_OFF)
                
                # multiple settings
                async with session.post(__url_settings__,
                                        data={socket.REQ_SETTINGS_MODE: timetable.JSON_MODE_TMAX,
                                              socket.REQ_SETTINGS_TMAX: 32.3,
                                              socket.REQ_SETTINGS_HVAC_MODE: common.HVAC_COOLING}) as q:
                    
                    self.assertEqual(q.status, 200)
                    self.assertEqual(self.timetable.mode, timetable.JSON_MODE_TMAX)
                    self.assertAlmostEqual(self.timetable.tmax, 32.3, delta=0.01)
                
                # some days
                old_set = self.timetable.__getstate__()
                friday = old_set[timetable.JSON_TIMETABLE][timetable.json_get_day_name(5)]
                sunday = old_set[timetable.JSON_TIMETABLE][timetable.json_get_day_name(7)]
                
                friday['h12'][0] = 44
                friday['h15'][1] = 45
                sunday['h06'][2] = 46
                sunday['h07'][3] = 47
                
                # all settings
                tt2 = copy.deepcopy(self.timetable)
                tt2.mode = timetable.JSON_MODE_TMAX
                tt2.update('thursday', 4, 1, 36.5)
                
                self.assertNotEqual(self.timetable, tt2)  # different before update
                
                async with session.post(__url_settings__, data={socket.REQ_SETTINGS_ALL: tt2.settings()}) as s:
                    self.assertEqual(s.status, 200)
        
                self.assertEqual(self.timetable, tt2)  # equal after update
        
        self.loop.run_until_complete(this_test())
    
    
    def test_unsupported_http_methods(self):
        async def this_test():
            async with aiohttp.ClientSession() as session:
                async with session.patch(__url_settings__, data={}) as pa:
                    self.assertEqual(pa.status, 501)
                
                async with session.put(__url_settings__, data={}) as pu:
                    self.assertEqual(pu.status, 501)
                
                async with session.delete(__url_heating__) as de:
                    self.assertEqual(de.status, 501)
        
        self.loop.run_until_complete(this_test())