def test_house_code_input(self): response = self.client.post('/api/valve/') response = json.loads(response.content) errors = response['errors'] self.assertIn(HOUSE_CODE_NOT_FOUND_MSG.format(''), errors) self.assertEqual(response['status'], INVALID_INPUT_STATUS) response = self.client.post('/api/valve/HOUSECODE') response = json.loads(response.content) errors = response['errors'] self.assertIn(HOUSE_CODE_NOT_FOUND_MSG.format('HOUSECODE'), errors) self.assertEqual(response['status'], INVALID_INPUT_STATUS)
def valve_view(request, house_code): response = {'status': 200, 'content': None} errors = [] data = request.POST min_temp = None try: house_code = HouseCode.objects.get(code=house_code) except HouseCode.DoesNotExist as e: response['status'] = INVALID_INPUT_STATUS response['errors'] = [HOUSE_CODE_NOT_FOUND_MSG.format(house_code)] return JsonResponse(response) try: open_input = data['open'] open_input = int(open_input) if open_input < 0 or open_input > 100: raise ValueError() rev2.rev2_interface.open_valve(house_code=house_code, rad_open_percent=open_input) except ValueError: errors.append( 'Invalid input for parameter: open. Received: {}, expected: 0-100'. format(open_input)) response['status'] = INVALID_INPUT_STATUS except MultiValueDictKeyError: errors.append('Required input parameter: open') response['status'] = INVALID_INPUT_STATUS if len(errors): response['errors'] = errors response = json.dumps(response) return HttpResponse(response, content_type='application/json')
def valve_view(request, house_code): response = {'status': 200, 'content': None} errors = [] data = request.POST min_temp = None try: house_code = HouseCode.objects.get(code=house_code) except HouseCode.DoesNotExist as e: response['status'] = INVALID_INPUT_STATUS response['errors'] = [HOUSE_CODE_NOT_FOUND_MSG.format(house_code)] return JsonResponse(response) try: open_input = data['open'] open_input = int(open_input) if open_input < 0 or open_input > 100: raise ValueError() rev2.rev2_interface.open_valve(house_code=house_code, rad_open_percent=open_input) except ValueError: errors.append('Invalid input for parameter: open. Received: {}, expected: 0-100'.format(open_input)) response['status'] = INVALID_INPUT_STATUS except MultiValueDictKeyError: errors.append('Required input parameter: open') response['status'] = INVALID_INPUT_STATUS if len(errors): response['errors'] = errors response = json.dumps(response) return HttpResponse(response, content_type='application/json')
def test_house_code_does_not_exist(self): response = self.client.post('/led/house-code', data={'house-code': 'E2-E1'}) response = json.loads(response.content) self.assertEqual(response['status'], INVALID_INPUT_STATUS) self.assertEqual(response['errors'], [HOUSE_CODE_NOT_FOUND_MSG.format('E2-E1')])
def led_view(request, house_code): response = {'status': 200, 'content': None} errors = [] try: house_code = HouseCode.objects.get(code=house_code) except ObjectDoesNotExist: response['status'] = INVALID_INPUT_STATUS response['errors'] = [HOUSE_CODE_NOT_FOUND_MSG.format(house_code)] return JsonResponse(response) # colour try: colour = request.POST['colour'] colour = int(colour) if colour not in VALID_LED_COLOURS: raise ValidationError('') except (ValidationError, ValueError) as e: response['status'] = INVALID_INPUT_STATUS errors.append(INVALID_LED_COLOUR_MSG.format(colour)) except MultiValueDictKeyError: response['status'] = INVALID_INPUT_STATUS errors.append(MISSING_LED_COLOUR_MSG) # state try: state = request.POST['state'] state = int(state) if state not in VALID_LED_STATES: raise ValidationError('') except (ValidationError, ValueError) as e: response['status'] = INVALID_INPUT_STATUS errors.append(INVALID_LED_STATE_MSG.format(state)) except MultiValueDictKeyError: response['status'] = INVALID_INPUT_STATUS errors.append(MISSING_LED_STATE_MSG) # repeat_interval try: repeat_interval = request.POST['repeat-interval'] repeat_interval = int(repeat_interval) if repeat_interval not in VALID_LED_REPEAT_INTERVALS: raise ValidationError('') except (ValidationError, ValueError) as e: response['status'] = INVALID_INPUT_STATUS errors.append(INVALID_LED_REPEAT_INTERVAL_MSG.format(repeat_interval)) except MultiValueDictKeyError: response['status'] = INVALID_INPUT_STATUS errors.append(MISSING_LED_REPEAT_INTERVAL_MSG) if len(errors): response['errors'] = errors else: rev2.rev2_interface.set_led_settings(house_code=house_code, colour=colour, state=state, repeat_interval=repeat_interval) return JsonResponse(response)
def debug_view(request, house_code): response = {'status': 200, 'content': None} try: house_code = HouseCode.objects.get(code=house_code) house_code.debug() except ObjectDoesNotExist: response['status'] = INVALID_INPUT_STATUS response['errors'] = [HOUSE_CODE_NOT_FOUND_MSG.format(house_code)] return JsonResponse(response)
def test_non_existant_house_code_returns_error(self): response = self.client.post('/api/valve/FA-32', data={ 'open': '50', "min_temp": '7', 'max_temp': '20' }) response = json.loads(response.content) self.assertEqual(response['errors'], [HOUSE_CODE_NOT_FOUND_MSG.format('FA-32')]) self.assertEqual(response['status'], INVALID_INPUT_STATUS)
def status_view(request, house_code): response = {'status': 200, 'content': None} errors = [] try: house_code = HouseCode.objects.get(code=house_code) except HouseCode.DoesNotExist: response['status'] = INVALID_INPUT_STATUS response['errors'] = [HOUSE_CODE_NOT_FOUND_MSG.format(house_code)] return JsonResponse(response) response['content'] = house_code.to_dict() return JsonResponse(response)
def relative_humidity_view(request): response = {"status": 200, "content": None} try: hc = HouseCode.objects.get(code=request.POST["house-code"]) hc.relative_humidity = request.POST["relative-humidity"] try: hc.full_clean() hc.save() except ValidationError as e: response["status"] = INVALID_INPUT_STATUS response["errors"] = e.message_dict["relative_humidity"] except HouseCode.DoesNotExist: response["status"] = INVALID_INPUT_STATUS response["errors"] = [HOUSE_CODE_NOT_FOUND_MSG.format(request.POST["house-code"])] return JsonResponse(response)
def temperature_ds18b20_view(request): response = {"status": 200, "content": None} try: hc = HouseCode.objects.get(code=request.POST["house-code"]) if temperature_is_valid(request.POST["temperature-ds18b20"]): hc.temperature_ds18b20 = float(request.POST["temperature-ds18b20"]) hc.save() else: response["status"] = INVALID_INPUT_STATUS response["errors"] = [ api.models.INVALID_TEMPERATURE_DS18B20_MSG.format(request.POST["temperature-ds18b20"]) ] except HouseCode.DoesNotExist: response["status"] = INVALID_INPUT_STATUS response["errors"] = [HOUSE_CODE_NOT_FOUND_MSG.format(request.POST["house-code"])] return JsonResponse(response)
def relative_humidity_view(request): response = {'status': 200, 'content': None} try: hc = HouseCode.objects.get(code=request.POST['house-code']) hc.relative_humidity = request.POST['relative-humidity'] try: hc.full_clean() hc.save() except ValidationError as e: response['status'] = INVALID_INPUT_STATUS response['errors'] = e.message_dict['relative_humidity'] except HouseCode.DoesNotExist: response['status'] = INVALID_INPUT_STATUS response['errors'] = [ HOUSE_CODE_NOT_FOUND_MSG.format(request.POST['house-code']) ] return JsonResponse(response)
def test_main(self): # user adds a house code to the database self.post_house_code('FA-32') # user reloads the api page self.initialise_page() h2 = self.section.find_element_by_tag_name('h2') self.assertEqual(h2.text, 'POST /api/led/<house-code>') # user inputs valid input self.house_code_input.send_keys('FA-32') self.colour_input.send_keys('0') self.state_input.send_keys('0') self.repeat_interval_input.send_keys('120') self.form.submit() self.assertEqual(self.browser.current_url, self.server_url + '/api/led/FA-32') json_response = self.get_json_response() self.assertEqual(json_response['status'], 200) self.assertEqual(json_response['content'], None) # TODO: User needs to be able to see the result # Currently the LED post does not affect the cache and is just a dummy function # user reloads api page # user inputs non existent house code self.initialise_page() self.house_code_input.send_keys('FA-33') self.form.submit() json_response = self.get_json_response() self.assertEqual(json_response['status'], INVALID_INPUT_STATUS) self.assertEqual(json_response['errors'], [HOUSE_CODE_NOT_FOUND_MSG.format('FA-33')]) # user inputs empty string for the colour self.initialise_page() self.house_code_input.send_keys('FA-32') self.form.submit() json_response = self.get_json_response() self.assertEqual(json_response['status'], INVALID_INPUT_STATUS) self.assertIn(INVALID_LED_COLOUR_MSG.format(''), json_response['errors']) self.assertIn(INVALID_LED_STATE_MSG.format(''), json_response['errors']) self.assertIn(INVALID_LED_REPEAT_INTERVAL_MSG.format(''), json_response['errors'])
def temperature_ds18b20_view(request): response = {'status': 200, 'content': None} try: hc = HouseCode.objects.get(code=request.POST['house-code']) if temperature_is_valid(request.POST['temperature-ds18b20']): hc.temperature_ds18b20 = float(request.POST['temperature-ds18b20']) hc.save() else: response['status'] = INVALID_INPUT_STATUS response['errors'] = [ api.models.INVALID_TEMPERATURE_DS18B20_MSG.format( request.POST['temperature-ds18b20']) ] except HouseCode.DoesNotExist: response['status'] = INVALID_INPUT_STATUS response['errors'] = [ HOUSE_CODE_NOT_FOUND_MSG.format(request.POST['house-code']) ] return JsonResponse(response)
def test_main(self): # user inputs a house code into the database self.post_house_code('FA-32') # user reloads the api page self.initialise_page() h2 = self.section.find_element_by_tag_name('h2') self.assertEqual(h2.text, '/api/debug/<house code>') # user turns on the debugging self.house_code_input.send_keys('FA-32') self.form.submit() self.assertEqual(self.browser.current_url, self.server_url + '/api/debug/FA-32') # user provides a house code that doesn't exist self.initialise_page() self.form.submit() json_response = self.get_json_response() self.assertEqual(json_response['status'], INVALID_INPUT_STATUS) self.assertEqual(json_response['errors'], [HOUSE_CODE_NOT_FOUND_MSG.format('')])
def test_non_existent_house_code(self): response = self.client.post('/api/led/FA-32', data={}) response = json.loads(response.content) self.assertEqual(response['status'], INVALID_INPUT_STATUS) self.assertIn(HOUSE_CODE_NOT_FOUND_MSG.format('FA-32'), response['errors'])
def test_main(self): self.initialise_page() h2 = self.section.find_element_by_tag_name("h2") self.assertEqual(h2.text, "POST /api/valve/<house-code>") section = self.browser.find_element_by_id( "id-post-house-codes-section") input = section.find_element_by_id("id-house-codes-input") input.send_keys("FA-32\n") # user inputs valid input self.initialise_page() self.house_code_input.send_keys('FA-32') self.open_input.send_keys("50") self.form.submit() self.assertEqual(self.browser.current_url, self.server_url + '/api/valve/FA-32') # TODO: Test the response of the form submission, don't know what the response looks like currently json_response = self.get_json_response() self.assertEqual(json_response['status'], 200) # user inputs a house-code that has a valid format but does not exist self.initialise_page() self.house_code_input.send_keys('FA-11') self.form.submit() response = json.loads( self.browser.find_element_by_tag_name("pre").text) self.assertEqual(response['errors'], [HOUSE_CODE_NOT_FOUND_MSG.format('FA-11')]) # form validation # invalid house-code x = self.TestParameterSet() x.inputs.house_code = '' x.inputs.open_input = '50' x.expected_errors = [HOUSE_CODE_NOT_FOUND_MSG.format('')] x.expected_status_code = INVALID_INPUT_STATUS self.run_input_validation_test(x) x = self.TestParameterSet() x.inputs.house_code = 'HOUSECODE' x.inputs.open_input = '50' x.expected_errors = [HOUSE_CODE_NOT_FOUND_MSG.format('HOUSECODE')] x.expected_status_code = INVALID_INPUT_STATUS self.run_input_validation_test(x) test_parameter_sets = [] # empty inputs x = self.TestParameterSet() x.inputs.house_code = 'FA-32' x.inputs.open_input = '' x.expected_errors = [ 'Invalid input for parameter: open. Received: , expected: 0-100' ] x.expected_status_code = INVALID_INPUT_STATUS test_parameter_sets += [x] # open outside range - below min x = self.TestParameterSet() x.inputs.house_code = 'FA-32' x.inputs.open_input = "-1" x.expected_status_code = INVALID_INPUT_STATUS x.expected_errors = [ "Invalid input for parameter: open. Received: -1, expected: 0-100" ] test_parameter_sets += [x] # open outside range - above max x = self.TestParameterSet() x.inputs.house_code = 'FA-32' x.inputs.open_input = "101" x.expected_status_code = INVALID_INPUT_STATUS x.expected_errors = [ "Invalid input for parameter: open. Received: 101, expected: 0-100" ] test_parameter_sets += [x] for parameter_set in test_parameter_sets: self.run_input_validation_test(parameter_set)
def test_main(self): self.initialise_page() h2 = self.section.find_element_by_tag_name("h2") self.assertEqual(h2.text, "POST /api/valve/<house-code>") section = self.browser.find_element_by_id("id-post-house-codes-section") input = section.find_element_by_id("id-house-codes-input") input.send_keys("FA-32\n") # user inputs valid input self.initialise_page() self.house_code_input.send_keys('FA-32') self.open_input.send_keys("50") self.form.submit() self.assertEqual(self.browser.current_url, self.server_url + '/api/valve/FA-32') # TODO: Test the response of the form submission, don't know what the response looks like currently json_response = self.get_json_response() self.assertEqual(json_response['status'], 200) # user inputs a house-code that has a valid format but does not exist self.initialise_page() self.house_code_input.send_keys('FA-11') self.form.submit() response = json.loads(self.browser.find_element_by_tag_name("pre").text) self.assertEqual(response['errors'], [HOUSE_CODE_NOT_FOUND_MSG.format('FA-11')]) # form validation # invalid house-code x = self.TestParameterSet() x.inputs.house_code = '' x.inputs.open_input = '50' x.expected_errors = [HOUSE_CODE_NOT_FOUND_MSG.format('')] x.expected_status_code = INVALID_INPUT_STATUS self.run_input_validation_test(x) x = self.TestParameterSet() x.inputs.house_code = 'HOUSECODE' x.inputs.open_input = '50' x.expected_errors = [HOUSE_CODE_NOT_FOUND_MSG.format('HOUSECODE')] x.expected_status_code = INVALID_INPUT_STATUS self.run_input_validation_test(x) test_parameter_sets = [] # empty inputs x = self.TestParameterSet() x.inputs.house_code = 'FA-32' x.inputs.open_input = '' x.expected_errors = ['Invalid input for parameter: open. Received: , expected: 0-100'] x.expected_status_code = INVALID_INPUT_STATUS test_parameter_sets += [x] # open outside range - below min x = self.TestParameterSet() x.inputs.house_code = 'FA-32' x.inputs.open_input = "-1" x.expected_status_code = INVALID_INPUT_STATUS x.expected_errors = ["Invalid input for parameter: open. Received: -1, expected: 0-100"] test_parameter_sets += [x] # open outside range - above max x = self.TestParameterSet() x.inputs.house_code = 'FA-32' x.inputs.open_input = "101" x.expected_status_code = INVALID_INPUT_STATUS x.expected_errors = ["Invalid input for parameter: open. Received: 101, expected: 0-100"] test_parameter_sets += [x] for parameter_set in test_parameter_sets: self.run_input_validation_test(parameter_set)
def test_non_existant_house_code_returns_error(self): response = self.client.post('/api/valve/FA-32', data={'open': '50', "min_temp": '7', 'max_temp': '20'}) response = json.loads(response.content) self.assertEqual(response['errors'], [HOUSE_CODE_NOT_FOUND_MSG.format('FA-32')]) self.assertEqual(response['status'], INVALID_INPUT_STATUS)