def test_ws_devices(app, client): domoticz_login = app.config.DOMOTICZ_USERNAME domoticz_password = to_base64(str(app.config.DOMOTICZ_PASSWORD)) domoticz_password_invalid = to_base64('1234') with app.app_context(): valid_pin = to_base64(get_pin()) json_payload = { 'pin': valid_pin, 'client': 'Android Google Pixel 3', 'client_uuid': str(uuid.uuid1()), 'login': domoticz_login, 'password': domoticz_password } response = post_json(client, 'api/beacon_auth/login', json_payload) response_json = json_response(response) assert response.status_code == 200 assert 'access_token' in response_json access_token = response_json['access_token'] json_payload = {'access_token': access_token} response = get_json( client, 'api/system/ws_devices', headers={'Authorization': 'Bearer {}'.format(access_token)}) assert response.status_code == 200 response_json = json_response(response) assert response_json assert type(response_json['wsdevices']) == list
def test_login_mocked(mocker, app, client): mocker.patch('automoticz.utils.beacons.get_pin', return_value='0000') mocker.patch('automoticz.app.get_beacon_pin.delay') mocker.patch('automoticz.utils.beacons.get_default_auth_beacon_name', return_value='beacons/test_beacon') mocker.patch('automoticz.utils.beacons.get_default_project_namespace', return_value='project/automoticz-project') mocker.patch('automoticz.utils.beacons.unset_pin') mocker.patch('automoticz.utils.beacons.generate_pin', return_value='0000') mocker.patch('automoticz.api.beacon_auth.routes.set_beacon_pin') domoticz_login = app.config.DOMOTICZ_USERNAME domoticz_password = to_base64(str(app.config.DOMOTICZ_PASSWORD)) domoticz_password_invalid = to_base64('1234') json_payload = { 'pin': to_base64('0000'), 'client': 'Android Google Pixel 3', 'client_uuid': str(uuid.uuid1()), 'login': domoticz_login, 'password': domoticz_password } response = post_json(client, 'api/beacon_auth/login', json_payload) response_json = json_response(response) assert response.status_code == 200 assert 'access_token' in response_json json_payload = { 'pin': to_base64('0000'), 'client': 'Android Google Pixel 3', 'client_uuid': str(uuid.uuid1()), 'login': domoticz_login, 'password': domoticz_password_invalid } response = post_json(client, 'api/beacon_auth/login', json_payload) response_json = json_response(response) assert response.status_code == 400 assert constants.RESPONSE_MESSAGE.INVALID_CREDS == response_json['message'] json_payload = {'client': 'Android Google Pixel 3'} response = post_json(client, 'api/beacon_auth/login', json_payload) assert response.status_code == 400 json_payload = { 'pin': to_base64('1111'), 'client': 'Chrome Browser', 'client_uuid': str(uuid.uuid1()), 'login': domoticz_login, 'password': domoticz_password } response = post_json(client, 'api/beacon_auth/login', json_payload) response_json = json_response(response) assert response.status_code == 400 assert constants.RESPONSE_MESSAGE.INVALID_PIN == response_json['message']
def test_login(app, client): domoticz_login = app.config.DOMOTICZ_USERNAME domoticz_password = to_base64(str(app.config.DOMOTICZ_PASSWORD)) domoticz_password_invalid = to_base64('1234') with app.app_context(): valid_pin = to_base64(get_pin()) json_payload = { 'pin': valid_pin, 'client': 'Android Google Pixel 3', 'client_uuid': str(uuid.uuid1()), 'login': domoticz_login, 'password': domoticz_password } response = post_json(client, 'api/beacon_auth/login', json_payload) response_json = json_response(response) assert response.status_code == 200 assert 'access_token' in response_json with app.app_context(): valid_pin = to_base64(get_pin()) json_payload = { 'pin': valid_pin, 'client': 'Android Google Pixel 3', 'client_uuid': str(uuid.uuid1()), 'login': domoticz_login, 'password': domoticz_password_invalid } response = post_json(client, 'api/beacon_auth/login', json_payload) response_json = json_response(response) assert response.status_code == 400 assert constants.RESPONSE_MESSAGE.INVALID_CREDS == response_json['message'] json_payload = {'client': 'Android Google Pixel 3'} response = post_json(client, 'api/beacon_auth/login', json_payload) assert response.status_code == 400 json_payload = { 'pin': to_base64('1111'), 'client': 'Chrome Browser', 'client_uuid': str(uuid.uuid1()), 'login': domoticz_login, 'password': domoticz_password } response = post_json(client, 'api/beacon_auth/login', json_payload) response_json = json_response(response) assert response.status_code == 400 assert constants.RESPONSE_MESSAGE.INVALID_PIN == response_json['message']
def test_get_unauthorized(client): for category_id in range(1, 4): response = client.get('/categories/{}/items'.format(category_id), headers=create_headers()) resp = json_response(response) # Check if server returns 200 assert response.status_code == 200 # Check if pagination is correct assert all( key in resp for key in ['items', 'total_pages', 'page', 'total', 'per_page' ]) is True # Check if each dict contains these keys for res in resp['items']: assert all( key in res for key in ['id', 'name', 'description', 'updated', 'created' ]) is True # Check if is_owner not in item for res in resp['items']: assert 'is_owner' not in res
def test_put_authorized_invalid_data(client): # Init data category_id = 1 user = _create_user(client) headers = create_headers( access_token=generate_access_token(user['id']) ) item = _create_item_in_category(client, headers, category_id) item_id = item['id'] data = { 'name': 'New Item Name ({})'.format(random_string(100)) } # Update item response = client.put( '/categories/{}/items/{}'.format(category_id, item_id), headers=headers, data=json.dumps(data) ) resp = json_response(response) # Check if server returns 400 assert response.status_code == 400 # Check if each dict contains these keys assert all( key in resp for key in ['error_code', 'message'] ) is True
def test_post_authorized_unrecognized_field(client): # Init data user = _create_user(client) headers = create_headers( access_token=generate_access_token(user['id']) ) category_id = 1 data = { 'id': 100, 'name': 'My Item {}'.format(random_string(10)) } # Create item response = client.post( '/categories/{}/items'.format(category_id), headers=headers, data=json.dumps(data) ) resp = json_response(response) # Check if server returns 400 assert response.status_code == 400 # Check if each dict contains these keys assert all( key in resp for key in ['error_code', 'message'] ) is True
def test_post_unauthorized(client): headers = create_headers() category_id = 1 data = { 'name': 'My Item ({})'.format(random_string(10)) } # Create item response = client.post( '/categories/{}/items'.format(category_id), headers=headers, data=json.dumps(data) ) resp = json_response(response) # Check if server returns 401 assert response.status_code == 401 # Check if each dict contains these keys assert all( key in resp for key in ['message', 'error_code'] ) is True
def test_post_authorized(client): # Init data user = _create_user(client) headers = create_headers( access_token=generate_access_token(user['id']) ) category_id = 1 data = { 'name': 'My Item {}'.format(random_string(10)) } # Create item response = client.post( '/categories/{}/items'.format(category_id), headers=headers, data=json.dumps(data) ) resp = json_response(response) # Check if server returns 200 assert response.status_code == 200 # Check if each dict contains these keys assert all( key in resp for key in ['id', 'name', 'description', 'updated', 'created'] ) is True # Check if newly created item is has the same name assert resp['name'] == data['name'] assert resp['description'] == ''
def test_post_duplicated_email(client): credential = { 'username': '******', 'password': '******', 'name': 'Thinh Nguyen', 'email': '*****@*****.**' } response = client.post( '/users', headers=create_headers(), data=json.dumps(credential) ) resp = json_response(response) # Check if server returns 400 assert response.status_code == 400 # Check if these keys exists in response assert all( key in resp for key in ['error_code', 'message'] ) is True # Check if only email error assert 'email' in resp['errors'] assert 'username' not in resp['errors']
def test_post_no_name_field(client): # Init data user = _create_user(client) headers = create_headers( access_token=generate_access_token(user['id']) ) category_id = 1 data = { 'description': 'Hello testing' } # Create item response = client.post( '/categories/{}/items'.format(category_id), headers=headers, data=json.dumps(data) ) resp = json_response(response) # Check if server returns 400 assert response.status_code == 400 # Check if each dict contains these keys assert all( key in resp for key in ['error_code', 'message'] ) is True
def test_post_correct_input(client): credential = { 'username': '******', 'password': '******', 'name': 'Thinh Nguyen', 'email': '*****@*****.**' } response = client.post( '/users', headers=create_headers(), data=json.dumps(credential) ) resp = json_response(response) # Check if server returns 200 assert response.status_code == 200 # Check if these keys exists in response assert all( key in resp for key in ['id', 'username', 'name', 'created', 'updated'] ) is True # Check if password not in response assert 'password' not in resp.keys()
def test_post_invalid_auth_type(client): response = client.post('/authentication', headers={'Authorization': 'JWT abc'}, data=json.dumps({})) # Check if server returns 400 assert response.status_code == 400 # Check if these keys exists in response assert all(key in json_response(response).keys() for key in ['message', 'error_code']) is True
def test_get_invalid_category_id(client): for category_id in range(5, 7): response = client.get('/categories/{}/items'.format(category_id), headers=create_headers()) # Check if server returns 404 assert response.status_code == 404 # Check if these keys exists in response assert all(key in json_response(response).keys() for key in ['message', 'error_code']) is True
def test_post_correct_credentials(client): credential = {'username': '******', 'password': '******'} response = client.post('/authentication', headers=create_headers(), data=json.dumps(credential)) # Check if server returns 200 assert response.status_code == 200 # Check if the server return an access_token assert 'access_token' in json_response(response).keys()
def test_post_invalid_credentials(client): credential = {'username': '******', 'password': '******'} response = client.post('/authentication', headers=create_headers(), data=json.dumps(credential)) # Check if server returns 401 assert response.status_code == 401 # Check if these keys exists in response assert all(key in json_response(response).keys() for key in ['message', 'error_code']) is True
def test_logout(app, client): domoticz_login = app.config.DOMOTICZ_USERNAME domoticz_password = to_base64(str(app.config.DOMOTICZ_PASSWORD)) with app.app_context(): valid_pin = to_base64(get_pin()) json_payload = { 'pin': valid_pin, 'client': 'Android Google Pixel 3', 'client_uuid': str(uuid.uuid1()), 'login': domoticz_login, 'password': domoticz_password } response = post_json(client, 'api/beacon_auth/login', json_payload) response_json = json_response(response) access_token = response_json['access_token'] response = delete_json( client, 'api/beacon_auth/logout', headers={'Authorization': 'Bearer {}'.format(access_token)}) assert response.status_code == 200 response_json = json_response(response) assert response_json
def test_get_valid_category(client): for category_id in range(1, 4): response = client.get( '/categories/{}'.format(category_id), headers=create_headers() ) # Check if server returns 200 assert response.status_code == 200 # Check if these keys exists in response assert all( key in json_response(response).keys() for key in ['id', 'name', 'description', 'updated', 'created'] ) is True
def test_get_unauthorized_valid_category(client): category_id = 1 for item_id in range(1, 3): response = client.get('/categories/{}/items/{}'.format( category_id, item_id), headers=create_headers()) resp = json_response(response) # Check if server returns 200 assert response.status_code == 200 # Check if each dict contains these keys assert all(key in resp for key in ['id', 'name', 'description', 'updated', 'created']) is True
def test_ws_details(app, client): domoticz_login = app.config.DOMOTICZ_USERNAME domoticz_password = to_base64(str(app.config.DOMOTICZ_PASSWORD)) with app.app_context(): valid_pin = to_base64(get_pin()) json_payload = { 'pin': valid_pin, 'client': 'Android Google Pixel 3', 'client_uuid': str(uuid.uuid1()), 'login': domoticz_login, 'password': domoticz_password } response = post_json(client, 'api/beacon_auth/login', json_payload) response_json = json_response(response) assert response.status_code == 200 assert 'access_token' in response_json access_token = response_json['access_token']
def test_get_authorized_valid_pagination(client): response = client.get( '/categories/{}/items?page=1&per_page=1'.format(1), headers=create_headers(access_token=generate_access_token(1))) resp = json_response(response) # Check if server returns 200 assert response.status_code == 200 # Check if pagination is correct assert all(key in resp for key in ['items', 'total_pages', 'page', 'total', 'per_page']) is True # Check if it has 3 pages assert resp['total_pages'] == 3 # Check if number of items is correct assert len(resp['items']) == 1
def test_get_categories(client): response = client.get( '/categories', headers=create_headers() ) resp = json_response(response) # Check if server returns 200 assert response.status_code == 200 # Check if number of categories equals to 4 assert len(resp) == 4 # Check if each dict contains these keys for res in resp: assert all( key in res for key in ['id', 'name', 'description', 'updated', 'created'] ) is True
def test_ws_subsciber_register(app, database, client, sio): uuid = '40ad6536-a5a4-11e9-8474-70188b8d1ef7' expired_access_token = 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJuYmYiOjE1NjMwNDczODcsImlkZW50aXR5IjoiNDBhZDY1MzYtYTVhNC0xMWU5LTg0NzQtNzAxODhiOGQxZWY3IiwiaWF0IjoxNTYzMDQ3Mzg3LCJqdGkiOiJkZDJkOTczOS1lYTg2LTRmZGMtYTI2MC1mNDc4ZDNiYTg5ZmYiLCJleHAiOjE1NjMwNDc2ODcsInR5cGUiOiJhY2Nlc3MiLCJmcmVzaCI6ZmFsc2V9.eeeKjKOaJAjjIvo70wDwEMHf4rMdpdpiz4lm9ujQ2pg' domoticz_login = app.config.DOMOTICZ_USERNAME domoticz_password = to_base64(str(app.config.DOMOTICZ_PASSWORD)) with app.app_context(): valid_pin = to_base64(get_pin()) json_payload = { 'pin': valid_pin, 'client': 'Android Google Pixel 3', 'client_uuid': uuid, 'login': domoticz_login, 'password': domoticz_password } response = post_json(client, 'api/beacon_auth/login', json_payload) response_json = json_response(response) access_token = response_json['access_token'] sio_client = sio.test_client(app) sio_client.get_received() sio_client.emit('subscriber_register', { 'client_uuid': uuid, })