From 0f70d99a6e2eb2cc7d2471b212d3363b5a054a2d Mon Sep 17 00:00:00 2001 From: Sebastian Lettner <51201318+slettner@users.noreply.github.com> Date: Tue, 4 May 2021 19:49:24 +0200 Subject: [PATCH] test(docker): mocked unittests external calls (#1958) test: mocked external calls --- tests/integration/hub_usage/test_hub_usage.py | 102 +++++++++++++++++- .../hub_usage}/yaml/test-joint.yml | 0 tests/unit/docker/test_hub_build.py | 17 +++ tests/unit/docker/test_hub_build_level.py | 71 ------------ tests/unit/docker/test_hub_list.py | 18 +++- tests/unit/docker/test_hubio.py | 10 -- .../drivers/test_load_groundtruth_driver.py | 1 - 7 files changed, 133 insertions(+), 86 deletions(-) rename tests/{unit/docker => integration/hub_usage}/yaml/test-joint.yml (100%) delete mode 100644 tests/unit/docker/test_hub_build_level.py diff --git a/tests/integration/hub_usage/test_hub_usage.py b/tests/integration/hub_usage/test_hub_usage.py index 0569b17712a5a..7e93212705fc7 100644 --- a/tests/integration/hub_usage/test_hub_usage.py +++ b/tests/integration/hub_usage/test_hub_usage.py @@ -1,7 +1,11 @@ import os from pathlib import Path +import docker import pytest +from jina.logging import JinaLogger + +from jina.enums import BuildTestLevel from jina import __version__ as jina_version from jina.docker import hubapi @@ -12,7 +16,12 @@ from jina.helper import expand_dict from jina.jaml import JAML from jina.parsers import set_pod_parser -from jina.parsers.hub import set_hub_build_parser, set_hub_list_parser +from jina.parsers.hub import ( + set_hub_build_parser, + set_hub_list_parser, + set_hub_pushpull_parser, + set_hub_new_parser, +) from jina.peapods import Pod cur_dir = os.path.dirname(os.path.abspath(__file__)) @@ -92,6 +101,26 @@ def test_build_timeout_ready(): pass +@pytest.mark.timeout(360) +def test_hub_pull(): + args = set_hub_pushpull_parser().parse_args(['jinahub/pod.dummy_mwu_encoder:0.0.6']) + HubIO(args).pull() + + +@pytest.mark.timeout(360) +def test_hub_list(): + args = set_hub_list_parser().parse_args(['--keywords', 'numeric']) + response = HubIO(args).list() + assert len(response) > 0 + + +@pytest.mark.timeout(360) +def test_hub_list_non_existing_kind(): + args = set_hub_list_parser().parse_args(['--kind', 'does-not-exist']) + response = HubIO(args).list() + assert not response + + @pytest.mark.skip('https://github.com/jina-ai/jina/issues/1641') @pytest.mark.skipif( condition='GITHUB_TOKEN' not in os.environ, reason='Token not found' @@ -204,3 +233,74 @@ def test_hub_build_multistage(dockerfile_path): ) result = HubIO(args).build() assert result['is_build_success'] + + +@pytest.mark.parametrize('new_type', ['pod', 'app', 'template']) +def test_create_new(tmpdir, new_type): + args = set_hub_new_parser().parse_args( + ['--output-dir', str(tmpdir), '--type', new_type] + ) + HubIO(args).new(no_input=True) + list_dir = os.listdir(str(tmpdir)) + assert len(list_dir) == 1 + + +@pytest.fixture(scope='function') +def test_workspace(tmpdir): + os.environ['JINA_TEST_JOINT'] = str(tmpdir) + workspace_path = os.environ['JINA_TEST_JOINT'] + yield workspace_path + del os.environ['JINA_TEST_JOINT'] + + +@pytest.fixture(scope='function') +def docker_image(): + def _filter_repo_tag(image, image_name='jinahub/pod.dummy_mwu_encoder'): + tags = image.attrs['RepoTags'] if 'RepoTags' in image.attrs else None + if tags: + return tags[0].startswith(image_name) + else: + return False + + img_name = 'jinahub/pod.dummy_mwu_encoder:0.0.6' + client = docker.from_env() + client.images.pull(img_name) + images = client.images.list() + image_name = list(filter(lambda image: _filter_repo_tag(image), images))[0] + return image_name + + +def test_hub_build_level_pass(monkeypatch, test_workspace, docker_image): + args = set_hub_build_parser().parse_args( + ['path/hub-mwu', '--push', '--host-info', '--test-level', 'EXECUTOR'] + ) + expected_failed_levels = [] + + _, failed_levels = HubIO(args)._test_build( + docker_image, + BuildTestLevel.EXECUTOR, + os.path.join(cur_dir, 'yaml/test-joint.yml'), + 60000, + True, + JinaLogger('unittest'), + ) + + assert expected_failed_levels == failed_levels + + +def test_hub_build_level_fail(monkeypatch, test_workspace, docker_image): + args = set_hub_build_parser().parse_args( + ['path/hub-mwu', '--push', '--host-info', '--test-level', 'FLOW'] + ) + expected_failed_levels = [BuildTestLevel.POD_DOCKER, BuildTestLevel.FLOW] + + _, failed_levels = HubIO(args)._test_build( + docker_image, + BuildTestLevel.FLOW, + os.path.join(cur_dir, 'yaml/test-joint.yml'), + 60000, + True, + JinaLogger('unittest'), + ) + + assert expected_failed_levels == failed_levels diff --git a/tests/unit/docker/yaml/test-joint.yml b/tests/integration/hub_usage/yaml/test-joint.yml similarity index 100% rename from tests/unit/docker/yaml/test-joint.yml rename to tests/integration/hub_usage/yaml/test-joint.yml diff --git a/tests/unit/docker/test_hub_build.py b/tests/unit/docker/test_hub_build.py index 7d937f831b1d3..73b08f0ab191c 100644 --- a/tests/unit/docker/test_hub_build.py +++ b/tests/unit/docker/test_hub_build.py @@ -91,6 +91,23 @@ def test_hub_build_uses(): HubIO(args).build() +@pytest.mark.timeout(360) +def test_hub_build_uses(): + args = set_hub_build_parser().parse_args( + [os.path.join(cur_dir, 'hub-mwu'), '--test-uses', '--raise-error'] + ) + assert HubIO(args).build()['is_build_success'] + # build again it shall not fail + assert HubIO(args).build()['is_build_success'] + + args = set_hub_build_parser().parse_args( + [os.path.join(cur_dir, 'hub-mwu'), '--test-uses', '--daemon', '--raise-error'] + ) + assert HubIO(args).build()['is_build_success'] + # build again it shall not fail + assert HubIO(args).build()['is_build_success'] + + def test_hub_build_failures(): for j in [ 'bad-dockerfile', diff --git a/tests/unit/docker/test_hub_build_level.py b/tests/unit/docker/test_hub_build_level.py deleted file mode 100644 index 16a85fecdec0e..0000000000000 --- a/tests/unit/docker/test_hub_build_level.py +++ /dev/null @@ -1,71 +0,0 @@ -import os - -import docker -import pytest -from jina.docker.hubio import HubIO -from jina.enums import BuildTestLevel -from jina.logging import JinaLogger -from jina.parsers.hub import set_hub_build_parser - -cur_dir = os.path.dirname(os.path.abspath(__file__)) - - -@pytest.fixture(scope='function') -def test_workspace(tmpdir): - os.environ['JINA_TEST_JOINT'] = str(tmpdir) - workspace_path = os.environ['JINA_TEST_JOINT'] - yield workspace_path - del os.environ['JINA_TEST_JOINT'] - - -@pytest.fixture(scope='function') -def docker_image(): - def _filter_repo_tag(image, image_name='jinahub/pod.dummy_mwu_encoder'): - tags = image.attrs['RepoTags'] if 'RepoTags' in image.attrs else None - if tags: - return tags[0].startswith(image_name) - else: - return False - - img_name = 'jinahub/pod.dummy_mwu_encoder:0.0.6' - client = docker.from_env() - client.images.pull(img_name) - images = client.images.list() - image_name = list(filter(lambda image: _filter_repo_tag(image), images))[0] - return image_name - - -def test_hub_build_level_pass(monkeypatch, test_workspace, docker_image): - args = set_hub_build_parser().parse_args( - ['path/hub-mwu', '--push', '--host-info', '--test-level', 'EXECUTOR'] - ) - expected_failed_levels = [] - - _, failed_levels = HubIO(args)._test_build( - docker_image, - BuildTestLevel.EXECUTOR, - os.path.join(cur_dir, 'yaml/test-joint.yml'), - 60000, - True, - JinaLogger('unittest'), - ) - - assert expected_failed_levels == failed_levels - - -def test_hub_build_level_fail(monkeypatch, test_workspace, docker_image): - args = set_hub_build_parser().parse_args( - ['path/hub-mwu', '--push', '--host-info', '--test-level', 'FLOW'] - ) - expected_failed_levels = [BuildTestLevel.POD_DOCKER, BuildTestLevel.FLOW] - - _, failed_levels = HubIO(args)._test_build( - docker_image, - BuildTestLevel.FLOW, - os.path.join(cur_dir, 'yaml/test-joint.yml'), - 60000, - True, - JinaLogger('unittest'), - ) - - assert expected_failed_levels == failed_levels diff --git a/tests/unit/docker/test_hub_list.py b/tests/unit/docker/test_hub_list.py index 014f64f442cd3..99d365a97ecbb 100644 --- a/tests/unit/docker/test_hub_list.py +++ b/tests/unit/docker/test_hub_list.py @@ -1,4 +1,5 @@ -import pytest +import json +import mock from jina.docker.hubio import HubIO from jina.parsers.hub import set_hub_list_parser @@ -10,25 +11,36 @@ def test_hub_list_local_with_submodule(): assert len(response) > 1 -def test_hub_list_keywords(): +@mock.patch('jina.docker.hubapi.remote.urlopen') +def test_hub_list_keywords(mocker): + mocker.return_value.__enter__.return_value.read.return_value = json.dumps( + [{'name': 'foo'}, {'name': 'bar'}] + ) + args = set_hub_list_parser().parse_args(['--keywords', 'numeric']) response = HubIO(args).list() numeric_count = len(response) + mocker.assert_called_once() assert numeric_count > 1 args = set_hub_list_parser().parse_args(['--keywords', 'numeric', 'randjojd']) response = HubIO(args).list() combined_count = len(response) + assert mocker.call_count == 2 assert combined_count > 1 # Making sure both arguments are --keywords are considered as `either or` assert combined_count >= numeric_count -def test_hub_list_nonexisting_kind(): +@mock.patch('jina.docker.hubapi.remote.urlopen') +def test_hub_list_nonexisting_kind(mocker): + mocker.return_value.__enter__.return_value.read.return_value = json.dumps([]) + args = set_hub_list_parser().parse_args(['--kind', 'blah']) response = HubIO(args).list() + mocker.assert_called_once() assert not response diff --git a/tests/unit/docker/test_hubio.py b/tests/unit/docker/test_hubio.py index 14eca345e81ee..0380ae6060efa 100644 --- a/tests/unit/docker/test_hubio.py +++ b/tests/unit/docker/test_hubio.py @@ -12,16 +12,6 @@ cur_dir = os.path.dirname(os.path.abspath(__file__)) -@pytest.mark.parametrize('new_type', ['pod', 'app', 'template']) -def test_create_new(tmpdir, new_type): - args = set_hub_new_parser().parse_args( - ['--output-dir', str(tmpdir), '--type', new_type] - ) - HubIO(args).new(no_input=True) - list_dir = os.listdir(str(tmpdir)) - assert len(list_dir) == 1 - - def test_login(tmpdir, monkeypatch, mocker): import requests import webbrowser diff --git a/tests/unit/drivers/test_load_groundtruth_driver.py b/tests/unit/drivers/test_load_groundtruth_driver.py index fe38e45a908aa..8ca576ee333d6 100644 --- a/tests/unit/drivers/test_load_groundtruth_driver.py +++ b/tests/unit/drivers/test_load_groundtruth_driver.py @@ -1,6 +1,5 @@ from typing import Optional, Iterable -import numpy as np import pytest from jina import Request