From c6cc03747d8dd1984ec6799cd1720bde9ac900f0 Mon Sep 17 00:00:00 2001
From: Sebastiaan van Stijn <github@gone.nl>
Date: Fri, 18 Mar 2022 19:30:07 +0100
Subject: [PATCH] daemon/images: use gotest.tools for tests, and use sub-tests

Signed-off-by: Sebastiaan van Stijn <github@gone.nl>
---
 daemon/images/image_search_test.go | 99 ++++++++++++++----------------
 1 file changed, 45 insertions(+), 54 deletions(-)

diff --git a/daemon/images/image_search_test.go b/daemon/images/image_search_test.go
index 112802496c..d45bdcba5b 100644
--- a/daemon/images/image_search_test.go
+++ b/daemon/images/image_search_test.go
@@ -3,7 +3,6 @@ package images // import "github.com/docker/docker/daemon/images"
 import (
 	"context"
 	"errors"
-	"strings"
 	"testing"
 
 	"github.com/docker/docker/api/types"
@@ -11,6 +10,7 @@ import (
 	registrytypes "github.com/docker/docker/api/types/registry"
 	"github.com/docker/docker/errdefs"
 	"github.com/docker/docker/registry"
+	"gotest.tools/v3/assert"
 )
 
 type fakeService struct {
@@ -80,43 +80,40 @@ func TestSearchRegistryForImagesErrors(t *testing.T) {
 			expectedError: "invalid filter 'stars=invalid'",
 		},
 	}
-	for index, e := range errorCases {
-		daemon := &ImageService{
-			registryService: &fakeService{
-				shouldReturnError: e.shouldReturnError,
-			},
-		}
-		_, err := daemon.SearchRegistryForImages(context.Background(), e.filtersArgs, "term", 0, nil, map[string][]string{})
-		if err == nil {
-			t.Errorf("%d: expected an error, got nothing", index)
-		}
-		if !strings.Contains(err.Error(), e.expectedError) {
-			t.Errorf("%d: expected error to contain %s, got %s", index, e.expectedError, err.Error())
-		}
-		if e.shouldReturnError {
-			if !errdefs.IsUnknown(err) {
-				t.Errorf("%d: expected expected an errdefs.ErrUnknown, got: %T: %v", index, err, err)
+	for _, tc := range errorCases {
+		tc := tc
+		t.Run(tc.expectedError, func(t *testing.T) {
+			daemon := &ImageService{
+				registryService: &fakeService{
+					shouldReturnError: tc.shouldReturnError,
+				},
 			}
-			continue
-		}
-		if !errdefs.IsInvalidParameter(err) {
-			t.Errorf("%d: expected expected an errdefs.ErrInvalidParameter, got: %T: %v", index, err, err)
-		}
+			_, err := daemon.SearchRegistryForImages(context.Background(), tc.filtersArgs, "term", 0, nil, map[string][]string{})
+			assert.ErrorContains(t, err, tc.expectedError)
+			if tc.shouldReturnError {
+				assert.Check(t, errdefs.IsUnknown(err), "got: %T: %v", err, err)
+				return
+			}
+			assert.Check(t, errdefs.IsInvalidParameter(err), "got: %T: %v", err, err)
+		})
 	}
 }
 
 func TestSearchRegistryForImages(t *testing.T) {
 	term := "term"
 	successCases := []struct {
+		name            string
 		filtersArgs     filters.Args
 		registryResults []registrytypes.SearchResult
 		expectedResults []registrytypes.SearchResult
 	}{
 		{
+			name:            "empty results",
 			registryResults: []registrytypes.SearchResult{},
 			expectedResults: []registrytypes.SearchResult{},
 		},
 		{
+			name: "no filter",
 			registryResults: []registrytypes.SearchResult{
 				{
 					Name:        "name",
@@ -131,6 +128,7 @@ func TestSearchRegistryForImages(t *testing.T) {
 			},
 		},
 		{
+			name:        "is-automated=true, no results",
 			filtersArgs: filters.NewArgs(filters.Arg("is-automated", "true")),
 			registryResults: []registrytypes.SearchResult{
 				{
@@ -141,6 +139,7 @@ func TestSearchRegistryForImages(t *testing.T) {
 			expectedResults: []registrytypes.SearchResult{},
 		},
 		{
+			name:        "is-automated=true",
 			filtersArgs: filters.NewArgs(filters.Arg("is-automated", "true")),
 			registryResults: []registrytypes.SearchResult{
 				{
@@ -158,6 +157,7 @@ func TestSearchRegistryForImages(t *testing.T) {
 			},
 		},
 		{
+			name:        "is-automated=false, no results",
 			filtersArgs: filters.NewArgs(filters.Arg("is-automated", "false")),
 			registryResults: []registrytypes.SearchResult{
 				{
@@ -169,6 +169,7 @@ func TestSearchRegistryForImages(t *testing.T) {
 			expectedResults: []registrytypes.SearchResult{},
 		},
 		{
+			name:        "is-automated=false",
 			filtersArgs: filters.NewArgs(filters.Arg("is-automated", "false")),
 			registryResults: []registrytypes.SearchResult{
 				{
@@ -186,6 +187,7 @@ func TestSearchRegistryForImages(t *testing.T) {
 			},
 		},
 		{
+			name:        "is-official=true, no results",
 			filtersArgs: filters.NewArgs(filters.Arg("is-official", "true")),
 			registryResults: []registrytypes.SearchResult{
 				{
@@ -196,6 +198,7 @@ func TestSearchRegistryForImages(t *testing.T) {
 			expectedResults: []registrytypes.SearchResult{},
 		},
 		{
+			name:        "is-official=true",
 			filtersArgs: filters.NewArgs(filters.Arg("is-official", "true")),
 			registryResults: []registrytypes.SearchResult{
 				{
@@ -213,6 +216,7 @@ func TestSearchRegistryForImages(t *testing.T) {
 			},
 		},
 		{
+			name:        "is-official=false, no results",
 			filtersArgs: filters.NewArgs(filters.Arg("is-official", "false")),
 			registryResults: []registrytypes.SearchResult{
 				{
@@ -224,6 +228,7 @@ func TestSearchRegistryForImages(t *testing.T) {
 			expectedResults: []registrytypes.SearchResult{},
 		},
 		{
+			name:        "is-official=false",
 			filtersArgs: filters.NewArgs(filters.Arg("is-official", "false")),
 			registryResults: []registrytypes.SearchResult{
 				{
@@ -241,6 +246,7 @@ func TestSearchRegistryForImages(t *testing.T) {
 			},
 		},
 		{
+			name:        "stars=0",
 			filtersArgs: filters.NewArgs(filters.Arg("stars", "0")),
 			registryResults: []registrytypes.SearchResult{
 				{
@@ -258,6 +264,7 @@ func TestSearchRegistryForImages(t *testing.T) {
 			},
 		},
 		{
+			name:        "stars=0, no results",
 			filtersArgs: filters.NewArgs(filters.Arg("stars", "1")),
 			registryResults: []registrytypes.SearchResult{
 				{
@@ -269,6 +276,7 @@ func TestSearchRegistryForImages(t *testing.T) {
 			expectedResults: []registrytypes.SearchResult{},
 		},
 		{
+			name:        "stars=1",
 			filtersArgs: filters.NewArgs(filters.Arg("stars", "1")),
 			registryResults: []registrytypes.SearchResult{
 				{
@@ -291,6 +299,7 @@ func TestSearchRegistryForImages(t *testing.T) {
 			},
 		},
 		{
+			name: "stars=1, is-official=true, is-automated=true",
 			filtersArgs: filters.NewArgs(
 				filters.Arg("stars", "1"),
 				filters.Arg("is-official", "true"),
@@ -337,38 +346,20 @@ func TestSearchRegistryForImages(t *testing.T) {
 			},
 		},
 	}
-	for index, s := range successCases {
-		daemon := &ImageService{
-			registryService: &fakeService{
-				term:    term,
-				results: s.registryResults,
-			},
-		}
-		results, err := daemon.SearchRegistryForImages(context.Background(), s.filtersArgs, term, 0, nil, map[string][]string{})
-		if err != nil {
-			t.Errorf("%d: %v", index, err)
-		}
-		if results.Query != term {
-			t.Errorf("%d: expected Query to be %s, got %s", index, term, results.Query)
-		}
-		if results.NumResults != len(s.expectedResults) {
-			t.Errorf("%d: expected NumResults to be %d, got %d", index, len(s.expectedResults), results.NumResults)
-		}
-		for _, result := range results.Results {
-			found := false
-			for _, expectedResult := range s.expectedResults {
-				if expectedResult.Name == result.Name &&
-					expectedResult.Description == result.Description &&
-					expectedResult.IsAutomated == result.IsAutomated &&
-					expectedResult.IsOfficial == result.IsOfficial &&
-					expectedResult.StarCount == result.StarCount {
-					found = true
-					break
-				}
+	for _, tc := range successCases {
+		tc := tc
+		t.Run(tc.name, func(t *testing.T) {
+			daemon := &ImageService{
+				registryService: &fakeService{
+					term:    term,
+					results: tc.registryResults,
+				},
 			}
-			if !found {
-				t.Errorf("%d: expected results %v, got %v", index, s.expectedResults, results.Results)
-			}
-		}
+			results, err := daemon.SearchRegistryForImages(context.Background(), tc.filtersArgs, term, 0, nil, map[string][]string{})
+			assert.NilError(t, err)
+			assert.Equal(t, results.Query, term)
+			assert.Equal(t, results.NumResults, len(tc.expectedResults))
+			assert.DeepEqual(t, results.Results, tc.expectedResults)
+		})
 	}
 }