Skip to content

Commit

Permalink
Add tests for ImageFetcher
Browse files Browse the repository at this point in the history
[#90]

Signed-off-by: Danny Joyce <[email protected]>
Signed-off-by: Andrew Meyer <[email protected]>
  • Loading branch information
Danny Joyce authored and ameyer-pivotal committed Mar 12, 2019
1 parent 9086fe1 commit d65f07d
Show file tree
Hide file tree
Showing 2 changed files with 109 additions and 35 deletions.
40 changes: 5 additions & 35 deletions image_fetcher.go
Original file line number Diff line number Diff line change
Expand Up @@ -25,52 +25,22 @@ func (f *ImageFetcher) FetchUpdatedLocalImage(ctx context.Context, imageName str
return nil, err
}

found, err := expectedImage.Found()
if err != nil {
if found, err := expectedImage.Found(); err != nil {
return nil, err
}

if found {
} else if found {
err = f.Docker.PullImage(ctx, imageName, stdout)
if err != nil {
return nil, err
}

}
expectedImage, err = f.FetchLocalImage(imageName)
if err != nil {
return nil, err
}

return expectedImage, nil
return f.FetchLocalImage(imageName)
}

func (f *ImageFetcher) FetchLocalImage(imageName string) (image.Image, error) {
expectedImage, err := f.Factory.NewLocal(imageName)

if err != nil {
return nil, err
}

found, err := expectedImage.Found()

if err != nil {
return nil, err
}

if !found {
return nil, nil
}

return expectedImage, nil
return f.Factory.NewLocal(imageName)
}

func (f *ImageFetcher) FetchRemoteImage(imageName string) (image.Image, error) {
expectedImage, err := f.Factory.NewRemote(imageName)

if err != nil {
return nil, err
}

return expectedImage, nil
return f.Factory.NewRemote(imageName)
}
104 changes: 104 additions & 0 deletions image_fetcher_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,104 @@
package pack_test

import (
"context"
"io/ioutil"
"testing"

"github.com/fatih/color"
"github.com/golang/mock/gomock"
"github.com/sclevine/spec"
"github.com/sclevine/spec/report"

"github.com/buildpack/pack"
"github.com/buildpack/pack/mocks"
h "github.com/buildpack/pack/testhelpers"
)

func TestImageFetcher(t *testing.T) {
color.NoColor = true
spec.Run(t, "ImageFetcher", testImageFetcher, spec.Report(report.Terminal{}))
}

func testImageFetcher(t *testing.T, when spec.G, it spec.S) {
var (
fetcher pack.ImageFetcher
mockController *gomock.Controller
mockImageFactory *mocks.MockImageFactory
mockRemoteImage *mocks.MockImage
mockLocalImage *mocks.MockImage
mockDocker *mocks.MockDocker
)

it.Before(func() {
mockController = gomock.NewController(t)
mockImageFactory = mocks.NewMockImageFactory(mockController)
mockRemoteImage = mocks.NewMockImage(mockController)
mockLocalImage = mocks.NewMockImage(mockController)
mockDocker = mocks.NewMockDocker(mockController)
fetcher = pack.ImageFetcher{
Docker: mockDocker,
Factory: mockImageFactory,
}
})

it.After(func() {
mockController.Finish()
})

when("#FetchUpdatedLocalImage", func() {
when("remote image exists", func() {
it.Before(func() {
mockRemoteImage.EXPECT().Found().Return(true, nil)
mockImageFactory.EXPECT().NewRemote("some/image").Return(mockRemoteImage, nil)
mockImageFactory.EXPECT().NewLocal("some/image").Return(mockLocalImage, nil)
})

it("pulls remote image", func() {
mockDocker.EXPECT().PullImage(gomock.Any(), "some/image", gomock.Any())
img, err := fetcher.FetchUpdatedLocalImage(context.TODO(), "some/image", ioutil.Discard)
h.AssertNil(t, err)
h.AssertSameInstance(t, img, mockLocalImage)
})
})

when("remote image does not exist", func() {
it.Before(func() {
mockRemoteImage.EXPECT().Found().Return(false, nil)
mockImageFactory.EXPECT().NewRemote("some/image").Return(mockRemoteImage, nil)
mockImageFactory.EXPECT().NewLocal("some/image").Return(mockLocalImage, nil)
})

it("skips pulling image", func() {
mockDocker.EXPECT().PullImage(gomock.Any(), gomock.Any(), gomock.Any()).Times(0)
img, err := fetcher.FetchUpdatedLocalImage(context.TODO(), "some/image", ioutil.Discard)
h.AssertNil(t, err)
h.AssertSameInstance(t, img, mockLocalImage)
})
})
})

when("#FetchLocalImage", func() {
it.Before(func() {
mockImageFactory.EXPECT().NewLocal("some/image").Return(mockLocalImage, nil)
})

it("returns local image", func() {
img, err := fetcher.FetchLocalImage("some/image")
h.AssertNil(t, err)
h.AssertSameInstance(t, img, mockLocalImage)
})
})

when("#FetchRemoteImage", func() {
it.Before(func() {
mockImageFactory.EXPECT().NewRemote("some/image").Return(mockRemoteImage, nil)
})

it("returns remote image", func() {
img, err := fetcher.FetchRemoteImage("some/image")
h.AssertNil(t, err)
h.AssertSameInstance(t, img, mockRemoteImage)
})
})
}

0 comments on commit d65f07d

Please sign in to comment.