def test_parse_endpoint_success(client, skill_dir):
    test_request = {'text': 'hi', 'challenge': 'a challenge'}

    key = load_public_key(get_file_contents(os.path.join(skill_dir, 'id_rsa.pub')))
    secret = 'some secret'
    encrypted_msg = encrypt(message=json.dumps(test_request), public_key=key)
    signature = generate_signature(secret, json.dumps(test_request))
    response = client.post(
        '/parse',
        data=encrypted_msg,
        content_type='text',
        headers={'X-Webex-Assistant-Signature': signature},
        follow_redirects=True,
    )
    assert response.status_code == 200
    response_data = json.loads(response.data.decode('utf8'))
    assert response_data['dialogue_state'] == 'welcome'
    assert response_data['challenge'] == 'a challenge'
    # Use >= set comparison as newer versions of mindmeld may add fields
    assert set(response_data.keys()) >= {
        'history',
        'params',
        'frame',
        'dialogue_state',
        'request_id',
        'response_time',
        'request',
        'directives',
        'slots',
        'challenge',
    }
def test_health_endpoint_check_failed(client, skill_dir):
    key = load_public_key(get_file_contents(os.path.join(skill_dir, 'id_rsa.pub')))
    secret = 'wrong secret'
    challenge = 'challenge'
    encrypted_challenge = encrypt(message=challenge, public_key=key)
    signature = generate_signature(secret, challenge)
    response = client.get(
        f'/parse?challenge={quote(encrypted_challenge)}',
        headers={'X-Webex-Assistant-Signature': signature},
    )

    assert response.status_code == 400
    response_data = json.loads(response.data.decode('utf8'))

    assert response_data == {'status': 'error', 'error': 'Invalid signature', 'api_version': '1.0'}
def _public_key(keys_dir):
    key_data = get_file_contents(os.path.join(keys_dir, 'id_rsa.pub'))
    public_key = load_public_key(key_data)
    return public_key
def _private_key(keys_dir):
    key_data = get_file_contents(os.path.join(keys_dir, 'id_rsa'))
    private_key = load_private_key(key_data)
    return private_key
def test_load_public_key(key_type, keys_dir):
    key_data = get_file_contents(os.path.join(keys_dir, f'{key_type}.pub'))
    public_key = load_public_key(key_data)

    assert public_key
def test_load_private_key(key_type, keys_dir, passphrase):
    key_data = get_file_contents(os.path.join(keys_dir, key_type))
    password = passphrase if key_type.endswith('.encrypted') else None
    private_key = load_private_key(key_data, password=password)

    assert private_key