def _authenticate(self): """Authenticate.""" # to obtain csrftoken, remove Referer from headers headers = HEADERS.copy() headers.pop('Referer') # initial GET request self.client = requests.Session() self.client.proxies = self._proxies self.client.verify = self._ssl_verify self.client.stream = True self.client.get(LOGIN_ENDPOINT, headers=headers) # set headers to submit POST request token = INITIAL_DATA.copy() token['csrfmiddlewaretoken'] = self.csrftoken token['email'] = self._username token['password'] = self._password req = self.client.post(LOGIN_ENDPOINT, data=token, headers=HEADERS) if req.status_code != 302: req.raise_for_status() # populate device list self.html['home'] = generate_soup_html(req.text) # currently only one faucet is supported on the code # we have future plans to support it parsed_controller = serial_finder(self.html['home']) self.controllers.append( RainCloudyController(self, parsed_controller['controller_serial'], parsed_controller['faucet_serial'])) self.is_connected = True return True
def test_serial_finder(self): """Test serial finder method.""" from raincloudy.helpers import serial_finder self.assertRaises(TypeError, serial_finder, None) broken_html = generate_soup_html(load_fixture('home_broken.html')) self.assertRaises(RainCloudyException, serial_finder, broken_html)
def test_find_zone_name(self): """test find_zone_name method.""" from raincloudy.helpers import find_zone_name self.assertRaises(TypeError, find_zone_name, None, 1) # test when zone name is not found broken_html = generate_soup_html(load_fixture('home_broken.html')) self.assertIsNone(find_zone_name(broken_html, 1))
def test_find_controller_or_faucet_name(self): """Test find_controller_or_faucet_name method.""" from raincloudy.helpers import find_controller_or_faucet_name as fcfn self.assertRaises(TypeError, fcfn, None, None) self.assertRaises(TypeError, fcfn, self.rdy.html['home'], None) # test when controller is not found broken_html = generate_soup_html(load_fixture('home_broken.html')) self.assertIsNone(fcfn(broken_html, 'controller'))
def _refresh_html_home(self): """ Function to refresh the self._parent.html['home'] object which provides the status if zones are scheduled to start automatically (program_toggle). """ req = self._parent.client.get(HOME_ENDPOINT) if req.status_code == 403: self._parent.login() self.update() elif req.status_code == 200: self._parent.html['home'] = generate_soup_html(req.text) else: req.raise_for_status()
def _authenticate(self): """Authenticate.""" __location__ = os.path.realpath( os.path.join(os.getcwd(), os.path.dirname(__file__))) cert_file = Path(__location__ + "/wifiaquatimer_com_chain.cer") # to obtain csrftoken, remove Referer from headers headers = HEADERS.copy() headers.pop('Referer') # initial GET request self.client = requests.Session() self.client.proxies = self._proxies self.client.verify = cert_file.resolve() self.client.stream = True self.client.get(LOGIN_ENDPOINT, headers=headers) # set headers to submit POST request token = INITIAL_DATA.copy() token['csrfmiddlewaretoken'] = self.csrftoken token['email'] = self._username token['password'] = self._password req = self.client.post(LOGIN_ENDPOINT, data=token, headers=HEADERS) if req.status_code != 302: req.raise_for_status() home = self.client.get(url=HOME_ENDPOINT) self.html['home'] = generate_soup_html(home.text) setup = self.client.get(SETUP_ENDPOINT, headers=HEADERS) # populate device list self.html['setup'] = generate_soup_html(setup.text) controller_serials = controller_serial_finder(self.html['setup']) for index, controller_serial in enumerate(controller_serials): # We need to do a form submit for other controllers to get # faucet serials if index > 0: data = {'select_controller': index} self.html['setup'] = \ generate_soup_html( self.post( data, url=SETUP_ENDPOINT, referer=SETUP_ENDPOINT ).text) faucet_serials = faucet_serial_finder(self.html['setup']) faucets = [] for faucet_index, faucet_serial in enumerate(faucet_serials): # We need to do a form submit for other faucets to get # zone names if faucet_index > 0: data = {'select_faucet': faucet_index} self.html['setup'] = \ generate_soup_html( self.post( data, url=SETUP_ENDPOINT, referer=SETUP_ENDPOINT ).text) zone_names = find_zone_names(self.html['setup']) faucets.append({'serial': faucet_serial, 'zones': zone_names}) self._controllers.append( RainCloudyController(self, controller_serial, index, faucets)) self.is_connected = True return True
def update_home(self, data): """Update home html""" if not isinstance(data, str): raise TypeError("Function requires string response") self.html['home'] = generate_soup_html(data)