github.com/ouraigua/jenkins-library@v0.0.0-20231028010029-fbeaf2f3aa9b/pkg/versioning/docker_test.go (about) 1 //go:build unit 2 // +build unit 3 4 package versioning 5 6 import ( 7 "fmt" 8 "os" 9 "path/filepath" 10 "testing" 11 12 "github.com/stretchr/testify/assert" 13 ) 14 15 func TestDockerGetVersion(t *testing.T) { 16 t.Run("success case - FROM", func(t *testing.T) { 17 docker := Docker{ 18 readFile: func(filename string) ([]byte, error) { return []byte("FROM test:1.2.3"), nil }, 19 versionSource: "FROM", 20 } 21 version, err := docker.GetVersion() 22 assert.NoError(t, err) 23 assert.Equal(t, "1.2.3", version) 24 }) 25 26 t.Run("error case - FROM failed", func(t *testing.T) { 27 docker := Docker{ 28 readFile: func(filename string) ([]byte, error) { return []byte("FROM test"), nil }, 29 versionSource: "FROM", 30 } 31 _, err := docker.GetVersion() 32 assert.EqualError(t, err, "no version information available in FROM statement") 33 }) 34 35 t.Run("error case - FROM read error", func(t *testing.T) { 36 docker := Docker{ 37 readFile: func(filename string) ([]byte, error) { return []byte{}, fmt.Errorf("read error") }, 38 versionSource: "FROM", 39 } 40 _, err := docker.GetVersion() 41 assert.EqualError(t, err, "failed to read file 'Dockerfile': read error") 42 }) 43 44 t.Run("success case - buildTool", func(t *testing.T) { 45 46 dir := t.TempDir() 47 filePath := filepath.Join(dir, "package.json") 48 err := os.WriteFile(filePath, []byte(`{"version": "1.2.3"}`), 0700) 49 if err != nil { 50 t.Fatal("Failed to create test file") 51 } 52 docker := Docker{ 53 path: filePath, 54 versionSource: "npm", 55 } 56 version, err := docker.GetVersion() 57 assert.NoError(t, err) 58 assert.Equal(t, "1.2.3", version) 59 }) 60 61 t.Run("success case - ENV", func(t *testing.T) { 62 docker := Docker{ 63 readFile: func(filename string) ([]byte, error) { return []byte("FROM test:latest\n\nENV VERSION_ENV 1.2.3"), nil }, 64 versionSource: "VERSION_ENV", 65 } 66 version, err := docker.GetVersion() 67 assert.NoError(t, err) 68 assert.Equal(t, "1.2.3", version) 69 }) 70 71 t.Run("error case - ENV failed", func(t *testing.T) { 72 docker := Docker{ 73 readFile: func(filename string) ([]byte, error) { return []byte("FROM test:latest\n\nENV VERSION_ENV 1.2.3"), nil }, 74 versionSource: "NOT_FOUND", 75 } 76 _, err := docker.GetVersion() 77 assert.EqualError(t, err, "no version information available in ENV 'NOT_FOUND'") 78 }) 79 80 t.Run("error case - ENV read error", func(t *testing.T) { 81 docker := Docker{ 82 readFile: func(filename string) ([]byte, error) { return []byte{}, fmt.Errorf("read error") }, 83 versionSource: "VERSION_ENV", 84 } 85 _, err := docker.GetVersion() 86 assert.EqualError(t, err, "failed to read file 'Dockerfile': read error") 87 }) 88 89 t.Run("error case - fallback", func(t *testing.T) { 90 docker := Docker{ 91 readFile: func(filename string) ([]byte, error) { return []byte{}, fmt.Errorf("read error") }, 92 versionSource: "", 93 } 94 _, err := docker.GetVersion() 95 assert.Contains(t, fmt.Sprint(err), "failed to read file 'VERSION': open VERSION") 96 }) 97 } 98 99 func TestDockerSetVersion(t *testing.T) { 100 t.Run("success case", func(t *testing.T) { 101 var content []byte 102 docker := Docker{ 103 readFile: func(filename string) ([]byte, error) { return []byte("FROM test:1.2.3"), nil }, 104 writeFile: func(filename string, filecontent []byte, mode os.FileMode) error { content = filecontent; return nil }, 105 versionSource: "FROM", 106 } 107 err := docker.SetVersion("1.2.4") 108 assert.NoError(t, err) 109 assert.Contains(t, string(content), "1.2.4") 110 }) 111 112 t.Run("error case", func(t *testing.T) { 113 docker := Docker{ 114 readFile: func(filename string) ([]byte, error) { return []byte("FROM test:1.2.3"), nil }, 115 writeFile: func(filename string, filecontent []byte, mode os.FileMode) error { return fmt.Errorf("write error") }, 116 versionSource: "FROM", 117 } 118 err := docker.SetVersion("1.2.4") 119 assert.EqualError(t, err, "failed to write file 'VERSION': write error") 120 }) 121 122 t.Run("success case - buildTool", func(t *testing.T) { 123 dir := t.TempDir() 124 filePath := filepath.Join(dir, "package.json") 125 err := os.WriteFile(filePath, []byte(`{"version": "1.2.3"}`), 0700) 126 if err != nil { 127 t.Fatal("Failed to create test file") 128 } 129 docker := Docker{ 130 path: filePath, 131 versionSource: "npm", 132 } 133 _, err = docker.GetVersion() 134 assert.NoError(t, err) 135 err = docker.SetVersion("1.2.4") 136 assert.NoError(t, err) 137 packageJSON, err := os.ReadFile(filePath) 138 assert.Contains(t, string(packageJSON), `"version": "1.2.4"`) 139 versionContent, err := os.ReadFile(filepath.Join(dir, "VERSION")) 140 assert.Equal(t, "1.2.4", string(versionContent)) 141 }) 142 } 143 144 func TestVersionFromBaseImageTag(t *testing.T) { 145 tt := []struct { 146 docker *Docker 147 expected string 148 }{ 149 {docker: &Docker{content: []byte("")}, expected: ""}, 150 {docker: &Docker{content: []byte("FROM test")}, expected: ""}, 151 //{docker: &Docker{content: []byte("FROM test:latest")}, expected: ""}, 152 {docker: &Docker{content: []byte("FROM test:1.2.3")}, expected: "1.2.3"}, 153 {docker: &Docker{content: []byte("#COMMENT\nFROM test:1.2.3")}, expected: "1.2.3"}, 154 //{docker: &Docker{content: []byte("FROM my.registry:55555/test")}, expected: ""}, 155 //{docker: &Docker{content: []byte("FROM my.registry:55555/test:latest")}, expected: ""}, 156 {docker: &Docker{content: []byte("FROM my.registry:55555/test:1.2.3")}, expected: "1.2.3"}, 157 } 158 for _, test := range tt { 159 assert.Equal(t, test.expected, test.docker.versionFromBaseImageTag()) 160 } 161 } 162 163 func TestGetCoordinates(t *testing.T) { 164 docker := Docker{ 165 readFile: func(filename string) ([]byte, error) { return []byte("FROM test:1.2.3"), nil }, 166 versionSource: "FROM", 167 options: &Options{DockerImage: "my/test/image:tag"}, 168 } 169 170 coordinates, err := docker.GetCoordinates() 171 assert.NoError(t, err) 172 assert.Equal(t, Coordinates{GroupID: "", ArtifactID: "my_test_image_tag", Version: ""}, coordinates) 173 }