github.com/SAP/jenkins-library@v1.362.0/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  }