Example #1
0
def test_clone_should_extract_code():
    api = MockApi()
    config = fixture_config()
    project_config = fixture_project_config()
    project_meta = fixture_project_meta()

    shutil.copyfile(
        os.path.join('fixtures', 'test_bothub.yml'),
        os.path.join('test_result', 'test_lib_project_config.yml')
    )
    api.responses.append([{
        'id': 3,
        'name': 'WeatherBot',
        'status': 'online',
        'regdate': '0000-00-00 00:00:00'
    }])
    with open(os.path.join('fixtures', 'bot.tgz'), 'rb') as fin:
        code = fin.read()
    api.responses.append({
        'code': str(code)
    })

    target_dir = os.path.join('test_result', 'clone_result')
    cli = lib.Cli(project_config=project_config, api=api, config=config, project_meta=project_meta)
    cli.clone('WeatherBot', target_dir)

    assert os.path.isdir(os.path.join('test_result', 'clone_result')) is True
    assert os.path.isdir(os.path.join('test_result', 'clone_result', 'code')) is True
    assert os.path.isfile(os.path.join('test_result', 'clone_result', 'code', 'sourcefile.txt')) is True
Example #2
0
def test_deploy_should_execute_upload_api():
    api = MockApi()
    config = fixture_config()
    project_config = fixture_project_config()
    project_meta = fixture_project_meta()
    project_meta['id'] = 3
    project_meta.save()
    shutil.copyfile(
        os.path.join('fixtures', 'test_bothub.yml'),
        os.path.join('test_result', 'test_lib_project_config.yml')
    )

    api.responses.append(True)
    api.responses.append({
        'id': 3,
        'name': 'WeatherBot',
        'status': 'online',
        'regdate': '0000-00-00 00:00:00'
    })

    source_dir = os.path.join('fixtures', 'code')
    cli = lib.Cli(project_config=project_config, api=api, config=config, project_meta=project_meta)
    cli.deploy(source_dir=source_dir)

    tar_path = os.path.join('test_result', 'bot.tgz')
    make_dist_package(tar_path, source_dir=source_dir)
    with open(tar_path, 'rb') as fin:
        tar_content = fin.read()

    executed = api.executed.pop(0)
    assert executed == ('upload_code', 3, 'python3', tar_content, 'bothub')
Example #3
0
def add_nlu(nlu, api_key, agent_id):
    '''Add a NLU integration'''
    try:
        lib_cli = lib.Cli()
        credentials = {}
        if not nlu in ['apiai', 'dialogflow']:
            nlu = click.prompt('Choose a nlu to add: [apiai, dialogflow]',
                               type=click.Choice(['apiai', 'dialogflow']))
        nlu_list = {
            'apiai': [
                {
                    'name': 'api_key',
                    'value': api_key,
                    'prompt': 'Please enter{} Api AI {}',
                    'rule': r'.+'
                },
            ],
            'dialogflow': [
                {
                    'name': 'agent_id',
                    'value': agent_id,
                    'prompt': 'Please enter{} Dialogflow {}',
                    'rule': r'.+'
                },
            ],
        }
        credentials = ask_nlu_keys(nlu_list[nlu])
        if nlu == 'dialogflow':
            lib_cli.pull_agent(credentials['agent_id'])
        lib_cli.add_nlu(nlu, credentials)
        click.secho('Added a NLU: {}'.format(nlu))
    except exc.CliException as ex:
        click.secho('{}: {}'.format(ex.__class__.__name__, ex), fg='red')
Example #4
0
def test():
    '''Run test chat session'''
    try:
        lib_cli = lib.Cli(print_message=print_message)
        lib_cli.test()
    except exc.CliException as ex:
        click.secho('{}: {}'.format(ex.__class__.__name__, ex), fg='red')
Example #5
0
def test_logs_should_execute_api_call():
    api = MockApi()
    config = fixture_config()
    project_config = fixture_project_config()
    project_meta = fixture_project_meta()

    shutil.copyfile(
        os.path.join('fixtures', 'test_bothub.yml'),
        os.path.join('test_result', 'test_lib_project_config.yml')
    )
    api.responses.append([
        {'regdate': 3},
        {'regdate': 1},
        {'regdate': 2},
    ])
    cli = lib.Cli(project_config=project_config, api=api, config=config, project_meta=project_meta)
    result = cli.logs()
    assert result == [
        {'regdate': 1},
        {'regdate': 2},
        {'regdate': 3},
    ]

    executed = api.executed.pop(0)
    assert executed == ('get_project_execution_logs', 3)
Example #6
0
def create_project(create_dir=False):
    click.echo('Initialize a new project.')
    while True:
        try:
            lib_cli = lib.Cli()
            project_config_exists = lib_cli.project_config.is_exists()
            name = click.prompt('Project name')
            normalized_name = name.strip()
            if not normalized_name:
                continue
            target_dir = '.'
            if create_dir:
                target_dir = normalized_name
            click.secho('Creating project...', fg='green')
            lib_cli.init(normalized_name, '', target_dir=target_dir)

            if not project_config_exists:
                click.secho('Initialize project template.')
                lib_cli.init_code()
                click.secho('Download project template.')
                lib_cli.clone(normalized_name, target_dir=target_dir)
                click.echo('')
            else:
                click.secho('Skip to initialize a project template.')

            click.secho('Project has created.', fg='green')
            break
        except exc.Cancel:
            print_error('Project creation has cancelled.')
            break
        except exc.CliException as ex:
            print_error('{}: {}'.format(ex.__class__.__name__, ex))
            break
Example #7
0
def test_authenticate_should_save_config_file():
    transport, api = fixture_api()
    record_auth_token(transport)
    config = fixture_config()
    project_meta = fixture_project_meta()
    cli = lib.Cli(config=config, api=api, project_meta=project_meta)
    cli.authenticate('testuser', 'testpw')
    assert config.get('auth_token') == 'testtoken'
Example #8
0
def rm_nlu(nlu):
    '''Delete a NLU integration'''
    try:
        lib_cli = lib.Cli()
        lib_cli.rm_nlu(nlu)
        click.secho('Deleted a NLU: {}'.format(nlu))
    except exc.CliException as ex:
        click.secho('{}: {}'.format(ex.__class__.__name__, ex), fg='red')
Example #9
0
def rm_property(key):
    '''Delete a property'''
    try:
        lib_cli = lib.Cli()
        lib_cli.rm_properties(key)
        click.secho("Deleted a property: {}".format(key))
    except exc.CliException as ex:
        click.secho('{}: {}'.format(ex.__class__.__name__, ex), fg='red')
Example #10
0
def deploy(max_retries):
    '''Deploy project'''
    try:
        lib_cli = lib.Cli()
        lib_cli.deploy(console=click.echo, max_retries=max_retries)
        click.secho('Project is deployed.', fg='green')
    except exc.CliException as ex:
        click.secho('{}: {}'.format(ex.__class__.__name__, ex), fg='red')
Example #11
0
def rm_channel(channel):
    '''Remove a channel from current project'''
    try:
        lib_cli = lib.Cli()
        lib_cli.rm_channel(channel)
        click.secho('Deleted a channel: {}'.format(channel))
    except exc.CliException as ex:
        click.secho('{}: {}'.format(ex.__class__.__name__, ex), fg='red')
Example #12
0
def pull_agent():
    '''Pull agent from Dialogflow Server to local'''
    try:
        lib_cli = lib.Cli()
        lib_cli.pull_agent()
        credential = lib_cli.get_credential("dialogflow")
        click.secho('Pulled agent to: {}'.format(credential['agent_id']))
    except exc.CliException as ex:
        click.secho('{}: {}'.format(ex.__class__.__name__, ex), fg='red')
Example #13
0
def clone(project_name):
    '''Clone existing project'''

    try:
        lib_cli = lib.Cli()
        lib_cli.clone(project_name, create_dir=True)
        click.secho('Project {} is cloned.'.format(project_name), fg='green')
    except exc.CliException as ex:
        click.secho('{}: {}'.format(ex.__class__.__name__, ex), fg='red')
Example #14
0
def test_load_bot_should_passed():
    api = MockApi()
    config = fixture_config()
    project_config = fixture_project_config()
    project_meta = fixture_project_meta()
    cli = lib.Cli(project_config=project_config, api=api, config=config, project_meta=project_meta)

    api.responses.append([])
    cli._load_bot(target_dir='fixtures')
Example #15
0
def rm(name):
    '''Delete a project'''
    try:
        lib_cli = lib.Cli()
        lib_cli.rm(name)
        click.secho('Deleted a project: {}'.format(name))
    except exc.CliException as ex:
        click.secho('{}: {}'.format(ex.__class__.__name__, ex), fg='red')
    except ValueError as err:
        click.secho('{}'.format(err), fg='red')
Example #16
0
def test_wait_deploy_completion_should_passed():
    api = MockApi()
    config = fixture_config()
    project_config = fixture_project_config()
    project_meta = fixture_project_meta()
    cli = lib.Cli(project_config=project_config, api=api, config=config, project_meta=project_meta)

    for _ in range(3):
        api.responses.append({'status': 'offline'})
    api.responses.append({'status': 'online'})
    cli._wait_deploy_completion(3, None, wait_interval=0, max_retries=4)
Example #17
0
def ls_property():
    '''Get property list'''
    try:
        lib_cli = lib.Cli()
        properties = lib_cli.ls_properties()
        properties_list = [(k, v) for k, v in properties.items()]
        header = ['Name', 'Value']
        data = [header] + properties_list
        table = Table(data)
        click.secho(table.table)
    except exc.CliException as ex:
        click.secho('{}: {}'.format(ex.__class__.__name__, ex), fg='red')
Example #18
0
def test_get_project_should_execute_api_get_project():
    api = MockApi()
    config = fixture_config()
    project_config = fixture_project_config()
    project_meta = fixture_project_meta()

    api.responses.append(True)

    cli = lib.Cli(project_config=project_config, api=api, config=config, project_meta=project_meta)
    assert cli.get_project(1) is True
    executed = api.executed.pop()
    assert executed == ('get_project', 1)
Example #19
0
def test_wait_deploy_completion_should_raise_failed():
    api = MockApi()
    config = fixture_config()
    project_config = fixture_project_config()
    project_meta = fixture_project_meta()
    cli = lib.Cli(project_config=project_config, api=api, config=config, project_meta=project_meta)

    for _ in range(4):
        api.responses.append({'status': 'offline'})

    with pytest.raises(exc.DeployFailed):
        cli._wait_deploy_completion(3, None, wait_interval=0, max_retries=4)
Example #20
0
def ls_nlu(long=False):
    '''List NLU integrations'''
    try:
        lib_cli = lib.Cli()
        nlus = lib_cli.ls_nlus(long)
        header = ['NLU']
        if long:
            header.append('Credentials')
        data = [header] + nlus
        table = Table(data)
        click.secho(table.table)
    except exc.CliException as ex:
        click.secho('{}: {}'.format(ex.__class__.__name__, ex), fg='red')
Example #21
0
def get_property(key):
    '''Get value of a property'''
    try:
        lib_cli = lib.Cli()
        result = lib_cli.get_properties(key)
        if isinstance(result, dict):
            print_properties(result)
        else:
            click.echo('{}: {}'.format(key, result))
    except KeyError:
        click.secho('No such property: {}'.format(key), fg='red')
    except exc.CliException as ex:
        click.secho('{}: {}'.format(ex.__class__.__name__, ex), fg='red')
Example #22
0
def ls_channel(long=False):
    '''List channels of current project'''
    try:
        lib_cli = lib.Cli()
        channels = lib_cli.ls_channel(long)
        header = ['Channel']
        if long:
            header.append('Credentials')
        data = [header] + channels
        table = Table(data)
        click.secho(table.table)
    except exc.CliException as ex:
        click.secho('{}: {}'.format(ex.__class__.__name__, ex), fg='red')
Example #23
0
def fixture_cli():
    transport, api = fixture_api()
    config = fixture_config()
    project_config = fixture_project_config()
    project_meta = fixture_project_meta()
    cli = lib.Cli(project_config=project_config, api=api, config=config, project_meta=project_meta)
    return {
        'transport': transport,
        'api': api,
        'config': config,
        'project_config': project_config,
        'project_meta': project_meta,
        'cli': cli
    }
Example #24
0
def ls(long=False):
    '''List projects'''
    try:
        lib_cli = lib.Cli()
        projects = lib_cli.ls(long)
        header = ['Project']
        if long:
            header += ['Status', 'Created']
        data = [header] + projects
        table = Table(data)
        click.secho(table.table)
        click.secho('You have {} projects'.format(len(projects)))
    except exc.CliException as ex:
        click.secho('{}: {}'.format(ex.__class__.__name__, ex), fg='red')
Example #25
0
def configure():
    '''Setup credentials'''
    try:
        click.echo('Please enter your BotHub.Studio login credentials:')
        username = click.prompt('username')
        password = click.prompt('password', hide_input=True)
        click.secho('Connecting to server...', fg='green')
        lib_cli = lib.Cli()
        lib_cli.authenticate(username, password)
        click.secho('Identified. Welcome {}.'.format(username), fg='green')
        click.echo('')
        print_introduction(1)
    except exc.CliException as ex:
        click.secho('{}: {}'.format(ex.__class__.__name__, ex), fg='red')
Example #26
0
def logs():
    '''Show error logs'''
    try:
        lib_cli = lib.Cli()
        log_entries = lib_cli.logs()
        for log_entry in log_entries:
            try:
                log_dict = json.loads(log_entry['log'])
                log_message = '{}\n{}'.format(log_dict['error'],
                                              log_dict['trace'])
            except JSONDecodeError:
                log_message = log_entry['log']
            click.echo('{} {}'.format(log_entry['regdate'], log_message))
    except exc.CliException as ex:
        click.secho('{}: {}'.format(ex.__class__.__name__, ex), fg='red')
Example #27
0
def test_rm_shoud_execute_delete_api():
    api = MockApi()
    config = fixture_config()
    project_config = fixture_project_config()
    project_meta = fixture_project_meta()

    record_api_projects(api)
    api.responses.append(True)

    cli = lib.Cli(project_config=project_config, api=api, config=config, project_meta=project_meta)
    cli.rm('myfirstbot')
    executed = api.executed.pop(0)
    assert executed == ('list_project', )
    executed2 = api.executed.pop(0)
    assert executed2 == ('delete_project', 10)
Example #28
0
def test_rm_shoud_raise_not_found():
    api = MockApi()
    config = fixture_config()
    project_config = fixture_project_config()
    project_meta = fixture_project_meta()

    record_api_projects(api)
    api.responses.append(True)

    cli = lib.Cli(project_config=project_config, api=api, config=config, project_meta=project_meta)

    with pytest.raises(exc.ProjectNameNotFound):
        cli.rm('myfourthbot')
        executed = api.executed.pop(0)
        assert executed == ('list_project', )
Example #29
0
def test_rm_nlu_should_execute_api_call():
    api = MockApi()
    config = fixture_config()
    project_config = fixture_project_config()
    project_meta = fixture_project_meta()

    shutil.copyfile(
        os.path.join('fixtures', 'test_bothub.yml'),
        os.path.join('test_result', 'test_lib_project_config.yml')
    )
    api.responses.append(True)
    cli = lib.Cli(project_config=project_config, api=api, config=config, project_meta=project_meta)
    cli.rm_nlu('mynlu')

    executed = api.executed.pop(0)
    assert executed == ('delete_project_nlu', 3, 'mynlu')
Example #30
0
def test_ls_channel_should_execute_api_call():
    api = MockApi()
    config = fixture_config()
    project_config = fixture_project_config()
    project_meta = fixture_project_meta()

    shutil.copyfile(
        os.path.join('fixtures', 'test_bothub.yml'),
        os.path.join('test_result', 'test_lib_project_config.yml')
    )
    record_api_channels(api)
    cli = lib.Cli(project_config=project_config, api=api, config=config, project_meta=project_meta)
    cli.ls_channel()

    executed = api.executed.pop(0)
    assert executed == ('get_project_channels', 3)