def test_update_context(self, cfngin_context): # type: ("MockCFNginContext") -> None """Test update_context.""" obj = DockerHookData() assert obj.update_context(cfngin_context) == obj assert cfngin_context.hook_data["docker"] == obj assert not obj.update_context()
def test_remove(cfngin_context, mock_docker_client, mocker): # type: ("MockCFNginContext", "DockerClient", "MockerFixture") -> None """Test remove.""" repo = "dkr.test.com/image" tags = ["latest", "oldest"] mock_image = MagicMock(spec=DockerImage, tags=["{}:{}".format(repo, tag) for tag in tags]) mock_image.attrs = {"RepoTags": mock_image.tags} args = ImageRemoveArgs(force=True, image=mock_image, tags=["latest", "oldest"]) mocker.patch.object(ImageRemoveArgs, "parse_obj", return_value=args) mocker.patch.object(DockerHookData, "client", mock_docker_client) docker_hook_data = DockerHookData() docker_hook_data.image = mock_image mock_from_cfngin_context = mocker.patch.object( DockerHookData, "from_cfngin_context", return_value=docker_hook_data) mock_update_context = mocker.patch.object(DockerHookData, "update_context", return_value=docker_hook_data) cfngin_context.hook_data["docker"] = docker_hook_data assert (remove(context=cfngin_context, force=args.force, image=mock_image, tags=args.tags) == docker_hook_data) mock_from_cfngin_context.assert_called_once_with(cfngin_context) docker_hook_data.client.api.remove_image.assert_has_calls( # pylint: disable=no-member [ call(force=True, image="{}:{}".format(args.repo, tag), noprune=False) for tag in args.tags ]) assert docker_hook_data.image is None mock_update_context.assert_called_once_with(cfngin_context)
def test_from_cfngin_context(self, cfngin_context): # type: ("MockCFNginContext") -> None """Test from_cfngin_context.""" obj = DockerHookData.from_cfngin_context(cfngin_context) assert isinstance(obj, DockerHookData) assert cfngin_context.hook_data["docker"] == obj # compare instance id as these should be the same instance assert id( DockerHookData.from_cfngin_context(cfngin_context)) == id(obj) cfngin_context.hook_data["docker"] = "something" new_obj = DockerHookData.from_cfngin_context(cfngin_context) # compare instance id as these should NOT be the same instance assert id(obj) != id(new_obj)
def test_build(cfngin_context, mocker, tmp_path): # type: ("MockCFNginContext", "MockerFixture", Path) -> None """Test build.""" (tmp_path / "Dockerfile").touch() mock_image = MagicMock( spec=Image, id=FAKE_IMAGE_ID, tags=MagicMock(return_value=["latest"]) ) mock_logs = [{"stream": "log message\n"}, {"not-stream": "no log"}] mock_client = MagicMock( images=MagicMock(build=MagicMock(return_value=(mock_image, mock_logs))) ) args = ImageBuildArgs(path=tmp_path) mocker.patch.object(ImageBuildArgs, "parse_obj", return_value=args) mocker.patch.object(DockerHookData, "client", mock_client) docker_hook_data = DockerHookData() mock_from_cfngin_context = mocker.patch.object( DockerHookData, "from_cfngin_context", return_value=docker_hook_data ) mock_update_context = mocker.patch.object( DockerHookData, "update_context", return_value=docker_hook_data ) cfngin_context.hook_data["docker"] = docker_hook_data assert build(context=cfngin_context, **args.dict()) == docker_hook_data mock_from_cfngin_context.assert_called_once_with(cfngin_context) mock_client.images.build.assert_called_once_with( path=str(args.path), **args.docker.dict() ) mock_image.tag.assert_called_once_with(None, tag="latest") mock_image.reload.assert_called_once() assert isinstance(docker_hook_data.image, DockerImage) assert docker_hook_data.image.image == mock_image mock_update_context.assert_called_once_with(cfngin_context)
def test_remove_image_not_found( cfngin_context: MockCFNginContext, mock_docker_client: DockerClient, mocker: MockerFixture, ) -> None: """Test remove ImageNotFound.""" args = ImageRemoveArgs(repo="dkr.test.com/image", tags=["latest"]) mocker.patch.object(ImageRemoveArgs, "parse_obj", return_value=args) mocker.patch.object(DockerHookData, "client", mock_docker_client) docker_hook_data = DockerHookData() mocker.patch.object( DockerHookData, "from_cfngin_context", return_value=docker_hook_data ) mock_update_context = mocker.patch.object( DockerHookData, "update_context", return_value=docker_hook_data ) cfngin_context.hook_data["docker"] = docker_hook_data docker_hook_data.client.api.remove_image.side_effect = ImageNotFound( args.repo + ":latest" # type: ignore ) assert remove(context=cfngin_context, **args.dict()) == docker_hook_data docker_hook_data.client.api.remove_image.assert_has_calls( # pylint: disable=no-member [ call(force=False, image="{}:{}".format(args.repo, tag), noprune=False) for tag in args.tags ] ) mock_update_context.assert_called_once_with(cfngin_context)
def test_push(cfngin_context, mock_docker_client, mocker): # type: ("MockCFNginContext", "DockerClient", "MockerFixture") -> None """Test push.""" args = ImagePushArgs(repo="dkr.test.com/image", tags=["latest", "oldest"]) mocker.patch.object(ImagePushArgs, "parse_obj", return_value=args) mocker.patch.object(DockerHookData, "client", mock_docker_client) docker_hook_data = DockerHookData() mock_from_cfngin_context = mocker.patch.object( DockerHookData, "from_cfngin_context", return_value=docker_hook_data) mock_update_context = mocker.patch.object(DockerHookData, "update_context", return_value=docker_hook_data) cfngin_context.hook_data["docker"] = docker_hook_data assert push(context=cfngin_context, **args.dict()) == docker_hook_data mock_from_cfngin_context.assert_called_once_with(cfngin_context) docker_hook_data.client.api.push.assert_has_calls( # pylint: disable=no-member [call(args.repo, tag=args.tags[0]), call(args.repo, tag=args.tags[1])]) mock_update_context.assert_called_once_with(cfngin_context)
def test_login(cfngin_context, mock_docker_client, mocker): # type: ("MockCFNginContext", "DockerClient", "MockerFixture") -> None """Test login.""" args = LoginArgs(password="******", registry="dkr.test.com", username="******") mocker.patch.object(LoginArgs, "parse_obj", return_value=args) mock_login = mocker.patch.object(mock_docker_client, "login") mocker.patch.object(DockerHookData, "client", mock_docker_client) docker_hook_data = DockerHookData() mock_from_cfngin_context = mocker.patch.object( DockerHookData, "from_cfngin_context", return_value=docker_hook_data) mock_update_context = mocker.patch.object(DockerHookData, "update_context", return_value=docker_hook_data) cfngin_context.hook_data["docker"] = docker_hook_data assert login(context=cfngin_context, **args.dict()) == docker_hook_data mock_from_cfngin_context.assert_called_once_with(cfngin_context) mock_login.assert_called_once_with(**args.dict()) mock_update_context.assert_called_once_with(cfngin_context)
def test_client(self, mocker): # type: ("MockerFixture") -> None """Test client.""" mock_local_client = mocker.patch(MODULE + ".DockerClient") obj = DockerHookData() assert obj.client == mock_local_client.from_env.return_value