kcl-lang.io/kpm@v0.8.7-0.20240520061008-9fc4c5efc8c7/pkg/package/toml_test.go (about)

     1  package pkg
     2  
     3  import (
     4  	"fmt"
     5  	"os"
     6  	"path/filepath"
     7  	"testing"
     8  
     9  	"github.com/BurntSushi/toml"
    10  	"github.com/stretchr/testify/assert"
    11  
    12  	"kcl-lang.io/kpm/pkg/utils"
    13  )
    14  
    15  const testTomlDir = "test_data_toml"
    16  
    17  func TestMarshalTOML(t *testing.T) {
    18  	modfile := ModFile{
    19  		Pkg: Package{
    20  			Name:    "MyKcl",
    21  			Edition: "v0.0.1",
    22  			Version: "v0.0.1",
    23  			Include: []string{"src/", "README.md", "LICENSE"},
    24  			Exclude: []string{"target/", ".git/", "*.log"},
    25  		},
    26  		Dependencies: Dependencies{
    27  			make(map[string]Dependency),
    28  		},
    29  	}
    30  
    31  	dep := Dependency{
    32  		Name:     "MyKcl1",
    33  		FullName: "MyKcl1_v0.0.2",
    34  		Source: Source{
    35  			Git: &Git{
    36  				Url: "https://github.com/test/MyKcl1.git",
    37  				Tag: "v0.0.2",
    38  			},
    39  		},
    40  	}
    41  
    42  	ociDep := Dependency{
    43  		Name:     "MyOciKcl1",
    44  		FullName: "MyOciKcl1_0.0.1",
    45  		Version:  "0.0.1",
    46  		Source: Source{
    47  			Oci: &Oci{
    48  				Tag: "0.0.1",
    49  			},
    50  		},
    51  	}
    52  
    53  	modfile.Dependencies.Deps["MyOciKcl1_0.0.1"] = ociDep
    54  	modfile.Dependencies.Deps["MyKcl1_v0.0.2"] = dep
    55  
    56  	got_data := modfile.MarshalTOML()
    57  
    58  	expected_data, _ := os.ReadFile(filepath.Join(getTestDir(testTomlDir), "expected.toml"))
    59  	expected_toml := utils.RmNewline(string(expected_data))
    60  
    61  	reversed_expected_data, _ := os.ReadFile(filepath.Join(getTestDir(testTomlDir), "expected_reversed.toml"))
    62  	reversed_expected_toml := utils.RmNewline(string(reversed_expected_data))
    63  	fmt.Printf("expected_toml: '%q'\n", expected_toml)
    64  	fmt.Printf("reversed_expected_toml: '%q'\n", reversed_expected_toml)
    65  	fmt.Printf("modfile: '%q'\n", got_data)
    66  	fmt.Printf("expected_toml == got_data: '%t'\n", expected_toml == got_data)
    67  	fmt.Printf("reversed_expected_toml == got_data: '%t'\n", reversed_expected_toml == got_data)
    68  	assert.Equal(t, (utils.RmNewline(expected_toml) == utils.RmNewline(got_data)) ||
    69  		(utils.RmNewline(reversed_expected_toml) == utils.RmNewline(got_data)), true, "got data is ", expected_toml, reversed_expected_toml, got_data)
    70  }
    71  
    72  func TestUnMarshalTOML(t *testing.T) {
    73  	modfile := ModFile{}
    74  	expected_data, _ := os.ReadFile(filepath.Join(getTestDir(testTomlDir), "expected.toml"))
    75  
    76  	_ = toml.Unmarshal(expected_data, &modfile)
    77  	fmt.Printf("modfile: %v\n", modfile)
    78  
    79  	assert.Equal(t, modfile.Pkg.Name, "MyKcl")
    80  	assert.Equal(t, modfile.Pkg.Edition, "v0.0.1")
    81  	assert.Equal(t, modfile.Pkg.Version, "v0.0.1")
    82  	assert.Equal(t, modfile.Pkg.Include, []string{"src/", "README.md", "LICENSE"})
    83  	assert.Equal(t, modfile.Pkg.Exclude, []string{"target/", ".git/", "*.log"})
    84  	assert.Equal(t, len(modfile.Dependencies.Deps), 2)
    85  	assert.NotEqual(t, modfile.Dependencies.Deps["MyKcl1"], nil)
    86  	assert.Equal(t, modfile.Dependencies.Deps["MyKcl1"].Name, "MyKcl1")
    87  	assert.Equal(t, modfile.Dependencies.Deps["MyKcl1"].FullName, "MyKcl1_v0.0.2")
    88  	assert.NotEqual(t, modfile.Dependencies.Deps["MyKcl1"].Source.Git, nil)
    89  	assert.Equal(t, modfile.Dependencies.Deps["MyKcl1"].Source.Git.Url, "https://github.com/test/MyKcl1.git")
    90  	assert.Equal(t, modfile.Dependencies.Deps["MyKcl1"].Source.Git.Tag, "v0.0.2")
    91  
    92  	assert.NotEqual(t, modfile.Dependencies.Deps["MyOciKcl1"], nil)
    93  	assert.Equal(t, modfile.Dependencies.Deps["MyOciKcl1"].Name, "MyOciKcl1")
    94  	assert.Equal(t, modfile.Dependencies.Deps["MyOciKcl1"].FullName, "MyOciKcl1_0.0.1")
    95  	assert.NotEqual(t, modfile.Dependencies.Deps["MyOciKcl1"].Source.Oci, nil)
    96  	assert.Equal(t, modfile.Dependencies.Deps["MyOciKcl1"].Source.Oci.Tag, "0.0.1")
    97  }
    98  
    99  func TestMarshalLockToml(t *testing.T) {
   100  	dep := Dependency{
   101  		Name:     "MyKcl1",
   102  		FullName: "MyKcl1_v0.0.2",
   103  		Version:  "v0.0.2",
   104  		Sum:      "hjkasdahjksdasdhjk",
   105  		Source: Source{
   106  			Git: &Git{
   107  				Url: "https://github.com/test/MyKcl1.git",
   108  				Tag: "v0.0.2",
   109  			},
   110  		},
   111  	}
   112  
   113  	ociDep := Dependency{
   114  		Name:     "MyOciKcl1",
   115  		FullName: "MyOciKcl1_0.0.1",
   116  		Version:  "0.0.1",
   117  		Sum:      "hjkasdahjksdasdhjk",
   118  		Source: Source{
   119  			Oci: &Oci{
   120  				Reg:  "test_reg",
   121  				Repo: "test_repo",
   122  				Tag:  "0.0.1",
   123  			},
   124  		},
   125  	}
   126  
   127  	deps := Dependencies{
   128  		make(map[string]Dependency),
   129  	}
   130  
   131  	deps.Deps[dep.Name] = dep
   132  	deps.Deps[ociDep.Name] = ociDep
   133  	tomlStr, _ := deps.MarshalLockTOML()
   134  	expected_data, _ := os.ReadFile(filepath.Join(getTestDir(testTomlDir), "expected_lock.toml"))
   135  	expected_toml := string(expected_data)
   136  	assert.Equal(t, utils.RmNewline(expected_toml), utils.RmNewline(tomlStr))
   137  }
   138  
   139  func TestUnmarshalLockToml(t *testing.T) {
   140  	deps := Dependencies{
   141  		make(map[string]Dependency),
   142  	}
   143  
   144  	expected_data, _ := os.ReadFile(filepath.Join(getTestDir(testTomlDir), "expected_lock.toml"))
   145  	expected_toml := string(expected_data)
   146  	_ = deps.UnmarshalLockTOML(expected_toml)
   147  
   148  	assert.Equal(t, len(deps.Deps), 2)
   149  	assert.NotEqual(t, deps.Deps["MyKcl1"], nil)
   150  	assert.Equal(t, deps.Deps["MyKcl1"].Name, "MyKcl1")
   151  	assert.Equal(t, deps.Deps["MyKcl1"].FullName, "MyKcl1_v0.0.2")
   152  	assert.Equal(t, deps.Deps["MyKcl1"].Version, "v0.0.2")
   153  	assert.Equal(t, deps.Deps["MyKcl1"].Sum, "hjkasdahjksdasdhjk")
   154  	assert.NotEqual(t, deps.Deps["MyKcl1"].Source.Git, nil)
   155  	assert.Equal(t, deps.Deps["MyKcl1"].Source.Git.Url, "https://github.com/test/MyKcl1.git")
   156  	assert.Equal(t, deps.Deps["MyKcl1"].Source.Git.Tag, "v0.0.2")
   157  
   158  	assert.NotEqual(t, deps.Deps["MyOciKcl1"], nil)
   159  	assert.Equal(t, deps.Deps["MyOciKcl1"].Name, "MyOciKcl1")
   160  	assert.Equal(t, deps.Deps["MyOciKcl1"].FullName, "MyOciKcl1_0.0.1")
   161  	assert.Equal(t, deps.Deps["MyOciKcl1"].Version, "0.0.1")
   162  	assert.Equal(t, deps.Deps["MyOciKcl1"].Sum, "hjkasdahjksdasdhjk")
   163  	assert.NotEqual(t, deps.Deps["MyOciKcl1"].Source.Oci, nil)
   164  	assert.Equal(t, deps.Deps["MyOciKcl1"].Source.Oci.Reg, "test_reg")
   165  	assert.Equal(t, deps.Deps["MyOciKcl1"].Source.Oci.Repo, "test_repo")
   166  	assert.Equal(t, deps.Deps["MyOciKcl1"].Source.Oci.Tag, "0.0.1")
   167  }
   168  
   169  func TestUnMarshalTOMLWithProfile(t *testing.T) {
   170  	modfile, err := LoadModFile(getTestDir("test_profile"))
   171  	assert.Equal(t, err, nil)
   172  	assert.Equal(t, modfile.Pkg.Name, "kpm")
   173  	assert.Equal(t, modfile.Pkg.Version, "0.0.1")
   174  	assert.Equal(t, modfile.Pkg.Edition, "0.0.1")
   175  	assert.Equal(t, *modfile.Profiles.Entries, []string{"main.k", "xxx/xxx/dir", "test.yaml"})
   176  }
   177  
   178  func TestUnMarshalOciUrl(t *testing.T) {
   179  	testDataDir := getTestDir("test_oci_url")
   180  
   181  	testCases := []struct {
   182  		Name          string
   183  		DepName       string
   184  		DepFullName   string
   185  		DepVersion    string
   186  		DepSourceReg  string
   187  		DepSourceRepo string
   188  		DepSourceTag  string
   189  	}{
   190  		{"unmarshal_0", "oci_pkg_name", "oci_pkg_name_0.0.1", "0.0.1", "ghcr.io", "test/helloworld", "0.0.1"},
   191  		{"unmarshal_1", "oci_pkg_name", "oci_pkg_name_0.0.1", "0.0.1", "localhost:5001", "test/helloworld", "0.0.1"},
   192  	}
   193  
   194  	for _, tc := range testCases {
   195  		modfile, err := LoadModFile(filepath.Join(testDataDir, tc.Name))
   196  		assert.Equal(t, err, nil)
   197  		assert.Equal(t, len(modfile.Dependencies.Deps), 1)
   198  		assert.Equal(t, modfile.Dependencies.Deps["oci_pkg_name"].Name, tc.DepName)
   199  		assert.Equal(t, modfile.Dependencies.Deps["oci_pkg_name"].FullName, tc.DepFullName)
   200  		assert.Equal(t, modfile.Dependencies.Deps["oci_pkg_name"].Version, tc.DepVersion)
   201  		assert.Equal(t, modfile.Dependencies.Deps["oci_pkg_name"].Source.Oci.Reg, tc.DepSourceReg)
   202  		assert.Equal(t, modfile.Dependencies.Deps["oci_pkg_name"].Source.Oci.Repo, tc.DepSourceRepo)
   203  		assert.Equal(t, modfile.Dependencies.Deps["oci_pkg_name"].Source.Oci.Tag, tc.DepVersion)
   204  	}
   205  }
   206  
   207  func TestMarshalOciUrl(t *testing.T) {
   208  	testDataDir := getTestDir("test_oci_url")
   209  
   210  	expectPkgPath := filepath.Join(testDataDir, "marshal_0", "kcl_mod_bk")
   211  	gotPkgPath := filepath.Join(testDataDir, "marshal_0", "kcl_mod_tmp")
   212  
   213  	expect, err := LoadModFile(expectPkgPath)
   214  	assert.Equal(t, err, nil)
   215  
   216  	err = os.MkdirAll(gotPkgPath, 0755)
   217  	assert.Equal(t, err, nil)
   218  	gotFile, _ := os.Create(filepath.Join(gotPkgPath, "kcl.mod"))
   219  
   220  	defer func() {
   221  		err = gotFile.Close()
   222  		assert.Equal(t, err, nil)
   223  		err = os.RemoveAll(gotPkgPath)
   224  		assert.Equal(t, err, nil)
   225  	}()
   226  
   227  	modfile := ModFile{
   228  		Pkg: Package{
   229  			Name:    "marshal_0",
   230  			Edition: "v0.9.0",
   231  			Version: "0.0.1",
   232  		},
   233  		Dependencies: Dependencies{
   234  			make(map[string]Dependency),
   235  		},
   236  	}
   237  
   238  	ociDep := Dependency{
   239  		Name:     "oci_pkg",
   240  		FullName: "oci_pkg_0.0.1",
   241  		Version:  "0.0.1",
   242  		Source: Source{
   243  			Oci: &Oci{
   244  				Tag: "0.0.1",
   245  			},
   246  		},
   247  	}
   248  
   249  	modfile.Dependencies.Deps["oci_pkg_0.0.1"] = ociDep
   250  
   251  	got_data := modfile.MarshalTOML()
   252  	_, err = gotFile.WriteString(got_data)
   253  	assert.Equal(t, err, nil)
   254  
   255  	got, err := LoadModFile(gotPkgPath)
   256  	assert.Equal(t, err, nil)
   257  
   258  	assert.Equal(t, expect.Pkg.Name, got.Pkg.Name)
   259  	assert.Equal(t, expect.Pkg.Edition, got.Pkg.Edition)
   260  	assert.Equal(t, expect.Pkg.Version, got.Pkg.Version)
   261  	assert.Equal(t, len(expect.Dependencies.Deps), len(got.Dependencies.Deps))
   262  	assert.Equal(t, expect.Dependencies.Deps["oci_pkg"].Name, got.Dependencies.Deps["oci_pkg"].Name)
   263  	assert.Equal(t, expect.Dependencies.Deps["oci_pkg"].FullName, got.Dependencies.Deps["oci_pkg"].FullName)
   264  	assert.Equal(t, expect.Dependencies.Deps["oci_pkg"].Source.Oci.Reg, got.Dependencies.Deps["oci_pkg"].Source.Oci.Reg)
   265  	assert.Equal(t, expect.Dependencies.Deps["oci_pkg"].Source.Oci.Repo, got.Dependencies.Deps["oci_pkg"].Source.Oci.Repo)
   266  	assert.Equal(t, expect.Dependencies.Deps["oci_pkg"].Source.Oci.Tag, got.Dependencies.Deps["oci_pkg"].Source.Oci.Tag)
   267  	assert.Equal(t, expect.Dependencies.Deps["oci_pkg"].Source.IntoOciUrl(), got.Dependencies.Deps["oci_pkg"].Source.IntoOciUrl())
   268  }
   269  
   270  func TestMarshalOciUrlIntoFile(t *testing.T) {
   271  	testDataDir := getTestDir("test_oci_url")
   272  
   273  	testCases := []string{"marshal_1", "marshal_2", "marshal_3"}
   274  
   275  	for _, tc := range testCases {
   276  		readKclModPath := filepath.Join(testDataDir, tc)
   277  		expectPath := filepath.Join(readKclModPath, "expect.mod")
   278  
   279  		readKclModFile, err := LoadModFile(readKclModPath)
   280  		assert.Equal(t, err, nil)
   281  		writeKclModFileContents := readKclModFile.MarshalTOML()
   282  		expectKclModFileContents, err := os.ReadFile(expectPath)
   283  		assert.Equal(t, err, nil)
   284  
   285  		assert.Equal(t, utils.RmNewline(string(expectKclModFileContents)), utils.RmNewline(writeKclModFileContents))
   286  	}
   287  }