コード例 #1
0
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
コード例 #2
0
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']
コード例 #3
0
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']
コード例 #4
0
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
コード例 #5
0
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
コード例 #6
0
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
コード例 #7
0
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
コード例 #8
0
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'] == ''
コード例 #9
0
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']
コード例 #10
0
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
コード例 #11
0
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()
コード例 #12
0
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
コード例 #13
0
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
コード例 #14
0
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()
コード例 #15
0
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
コード例 #16
0
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
コード例 #17
0
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
コード例 #18
0
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
コード例 #19
0
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']
コード例 #20
0
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
コード例 #21
0
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
コード例 #22
0
ファイル: test_ws.py プロジェクト: xbound/automoticz-server
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,
    })