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
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')
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')
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')
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)
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
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'
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')
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')
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')
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')
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')
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')
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')
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')
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)
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')
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)
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)
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')
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')
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')
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 }
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')
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')
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')
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)
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', )
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')
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)