client_test.go (6653B)
1 // Copyright 2019 The Hugo Authors. All rights reserved. 2 // 3 // Licensed under the Apache License, Version 2.0 (the "License"); 4 // you may not use this file except in compliance with the License. 5 // You may obtain a copy of the License at 6 // http://www.apache.org/licenses/LICENSE-2.0 7 // 8 // Unless required by applicable law or agreed to in writing, software 9 // distributed under the License is distributed on an "AS IS" BASIS, 10 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 11 // See the License for the specific language governing permissions and 12 // limitations under the License. 13 14 package modules 15 16 import ( 17 "bytes" 18 "fmt" 19 "os" 20 "path/filepath" 21 "sync/atomic" 22 "testing" 23 24 "github.com/gohugoio/hugo/common/hexec" 25 "github.com/gohugoio/hugo/config/security" 26 "github.com/gohugoio/hugo/hugofs/glob" 27 28 "github.com/gohugoio/hugo/htesting" 29 30 "github.com/gohugoio/hugo/hugofs" 31 32 qt "github.com/frankban/quicktest" 33 ) 34 35 func TestClient(t *testing.T) { 36 modName := "hugo-modules-basic-test" 37 modPath := "github.com/gohugoio/tests/" + modName 38 defaultImport := "modh2_2" 39 expect := `github.com/gohugoio/tests/hugo-modules-basic-test github.com/gohugoio/hugoTestModules1_darwin/modh2_2@v1.4.0 40 github.com/gohugoio/hugoTestModules1_darwin/modh2_2@v1.4.0 github.com/gohugoio/hugoTestModules1_darwin/modh2_2_1v@v1.3.0 41 github.com/gohugoio/hugoTestModules1_darwin/modh2_2@v1.4.0 github.com/gohugoio/hugoTestModules1_darwin/modh2_2_2@v1.3.0 42 ` 43 44 c := qt.New(t) 45 var clientID uint64 // we increment this to get each test in its own directory. 46 47 newClient := func(c *qt.C, withConfig func(cfg *ClientConfig), imp string) (*Client, func()) { 48 atomic.AddUint64(&clientID, uint64(1)) 49 workingDir, clean, err := htesting.CreateTempDir(hugofs.Os, fmt.Sprintf("%s-%d", modName, clientID)) 50 c.Assert(err, qt.IsNil) 51 themesDir := filepath.Join(workingDir, "themes") 52 err = os.Mkdir(themesDir, 0777) 53 c.Assert(err, qt.IsNil) 54 55 ccfg := ClientConfig{ 56 Fs: hugofs.Os, 57 WorkingDir: workingDir, 58 CacheDir: filepath.Join(workingDir, "modcache"), 59 ThemesDir: themesDir, 60 Exec: hexec.New(security.DefaultConfig), 61 } 62 63 withConfig(&ccfg) 64 ccfg.ModuleConfig.Imports = []Import{{Path: "github.com/gohugoio/hugoTestModules1_darwin/" + imp}} 65 client := NewClient(ccfg) 66 67 return client, clean 68 } 69 70 c.Run("All", func(c *qt.C) { 71 client, clean := newClient(c, func(cfg *ClientConfig) { 72 cfg.ModuleConfig = DefaultModuleConfig 73 }, defaultImport) 74 defer clean() 75 76 // Test Init 77 c.Assert(client.Init(modPath), qt.IsNil) 78 79 // Test Collect 80 mc, err := client.Collect() 81 c.Assert(err, qt.IsNil) 82 c.Assert(len(mc.AllModules), qt.Equals, 4) 83 for _, m := range mc.AllModules { 84 c.Assert(m, qt.Not(qt.IsNil)) 85 } 86 87 // Test Graph 88 var graphb bytes.Buffer 89 c.Assert(client.Graph(&graphb), qt.IsNil) 90 91 c.Assert(graphb.String(), qt.Equals, expect) 92 93 // Test Vendor 94 c.Assert(client.Vendor(), qt.IsNil) 95 graphb.Reset() 96 c.Assert(client.Graph(&graphb), qt.IsNil) 97 98 expectVendored := `project github.com/gohugoio/hugoTestModules1_darwin/modh2_2@v1.4.0+vendor 99 project github.com/gohugoio/hugoTestModules1_darwin/modh2_2_1v@v1.3.0+vendor 100 project github.com/gohugoio/hugoTestModules1_darwin/modh2_2_2@v1.3.0+vendor 101 ` 102 103 c.Assert(graphb.String(), qt.Equals, expectVendored) 104 105 // Test Tidy 106 c.Assert(client.Tidy(), qt.IsNil) 107 }) 108 109 c.Run("IgnoreVendor", func(c *qt.C) { 110 client, clean := newClient( 111 c, func(cfg *ClientConfig) { 112 cfg.ModuleConfig = DefaultModuleConfig 113 cfg.IgnoreVendor = globAll 114 }, defaultImport) 115 defer clean() 116 117 c.Assert(client.Init(modPath), qt.IsNil) 118 _, err := client.Collect() 119 c.Assert(err, qt.IsNil) 120 c.Assert(client.Vendor(), qt.IsNil) 121 122 var graphb bytes.Buffer 123 c.Assert(client.Graph(&graphb), qt.IsNil) 124 c.Assert(graphb.String(), qt.Equals, expect) 125 }) 126 127 c.Run("NoVendor", func(c *qt.C) { 128 mcfg := DefaultModuleConfig 129 mcfg.NoVendor = "**" 130 client, clean := newClient( 131 c, func(cfg *ClientConfig) { 132 cfg.ModuleConfig = mcfg 133 }, defaultImport) 134 defer clean() 135 136 c.Assert(client.Init(modPath), qt.IsNil) 137 _, err := client.Collect() 138 c.Assert(err, qt.IsNil) 139 c.Assert(client.Vendor(), qt.IsNil) 140 141 var graphb bytes.Buffer 142 c.Assert(client.Graph(&graphb), qt.IsNil) 143 c.Assert(graphb.String(), qt.Equals, expect) 144 }) 145 146 c.Run("VendorClosest", func(c *qt.C) { 147 mcfg := DefaultModuleConfig 148 mcfg.VendorClosest = true 149 150 client, clean := newClient( 151 c, func(cfg *ClientConfig) { 152 cfg.ModuleConfig = mcfg 153 s := "github.com/gohugoio/hugoTestModules1_darwin/modh1_1v" 154 g, _ := glob.GetGlob(s) 155 cfg.IgnoreVendor = g 156 }, "modh1v") 157 defer clean() 158 159 c.Assert(client.Init(modPath), qt.IsNil) 160 _, err := client.Collect() 161 c.Assert(err, qt.IsNil) 162 c.Assert(client.Vendor(), qt.IsNil) 163 164 var graphb bytes.Buffer 165 c.Assert(client.Graph(&graphb), qt.IsNil) 166 167 c.Assert(graphb.String(), qt.Contains, "github.com/gohugoio/hugoTestModules1_darwin/modh1_1v@v1.3.0 github.com/gohugoio/hugoTestModules1_darwin/modh1_1_1v@v1.1.0+vendor") 168 }) 169 170 // https://github.com/gohugoio/hugo/issues/7908 171 c.Run("createThemeDirname", func(c *qt.C) { 172 mcfg := DefaultModuleConfig 173 client, clean := newClient( 174 c, func(cfg *ClientConfig) { 175 cfg.ModuleConfig = mcfg 176 }, defaultImport) 177 defer clean() 178 179 dirname, err := client.createThemeDirname("foo", false) 180 c.Assert(err, qt.IsNil) 181 c.Assert(dirname, qt.Equals, filepath.Join(client.ccfg.ThemesDir, "foo")) 182 183 dirname, err = client.createThemeDirname("../../foo", true) 184 c.Assert(err, qt.IsNil) 185 c.Assert(dirname, qt.Equals, filepath.Join(client.ccfg.ThemesDir, "../../foo")) 186 187 dirname, err = client.createThemeDirname("../../foo", false) 188 c.Assert(err, qt.Not(qt.IsNil)) 189 190 absDir := filepath.Join(client.ccfg.WorkingDir, "..", "..") 191 dirname, err = client.createThemeDirname(absDir, true) 192 c.Assert(err, qt.IsNil) 193 c.Assert(dirname, qt.Equals, absDir) 194 dirname, err = client.createThemeDirname(absDir, false) 195 fmt.Println(dirname) 196 c.Assert(err, qt.Not(qt.IsNil)) 197 }) 198 } 199 200 var globAll, _ = glob.GetGlob("**") 201 202 func TestGetModlineSplitter(t *testing.T) { 203 c := qt.New(t) 204 205 gomodSplitter := getModlineSplitter(true) 206 207 c.Assert(gomodSplitter("\tgithub.com/BurntSushi/toml v0.3.1"), qt.DeepEquals, []string{"github.com/BurntSushi/toml", "v0.3.1"}) 208 c.Assert(gomodSplitter("\tgithub.com/cpuguy83/go-md2man v1.0.8 // indirect"), qt.DeepEquals, []string{"github.com/cpuguy83/go-md2man", "v1.0.8"}) 209 c.Assert(gomodSplitter("require ("), qt.IsNil) 210 211 gosumSplitter := getModlineSplitter(false) 212 c.Assert(gosumSplitter("github.com/BurntSushi/toml v0.3.1"), qt.DeepEquals, []string{"github.com/BurntSushi/toml", "v0.3.1"}) 213 }