Пример #1
0
 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()
Пример #2
0
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)
Пример #3
0
    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)
Пример #4
0
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)
Пример #5
0
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)
Пример #6
0
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)
Пример #7
0
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)
Пример #8
0
 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