From c4aaf1d5169cdff7a7554717506feb4e9436e858 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B8rn=20Erik=20Pedersen?= Date: Wed, 9 Feb 2022 14:12:17 +0100 Subject: [PATCH] postcss: Move integration test to its own package --- hugolib/resource_chain_test.go | 198 ------------------ .../postcss/integration_test.go | 148 +++++++++++++ 2 files changed, 148 insertions(+), 198 deletions(-) create mode 100644 resources/resource_transformers/postcss/integration_test.go diff --git a/hugolib/resource_chain_test.go b/hugolib/resource_chain_test.go index 723a4b9d974..6b80ec38a0c 100644 --- a/hugolib/resource_chain_test.go +++ b/hugolib/resource_chain_test.go @@ -14,7 +14,6 @@ package hugolib import ( - "bytes" "fmt" "io" "io/ioutil" @@ -27,19 +26,10 @@ import ( "testing" "time" - "github.com/gohugoio/hugo/config" - - jww "github.com/spf13/jwalterweatherman" - - "github.com/gohugoio/hugo/common/herrors" - "github.com/gohugoio/hugo/helpers" - "github.com/gohugoio/hugo/htesting" qt "github.com/frankban/quicktest" - "github.com/gohugoio/hugo/hugofs" - "github.com/gohugoio/hugo/common/loggers" "github.com/gohugoio/hugo/resources/resource_transformers/tocss/scss" ) @@ -713,194 +703,6 @@ JSON: {{ $json.RelPermalink }}: {{ $json.Content }} "JSONS: 2", "/jsons/data1.json: json1 content") } -func TestResourceChainPostCSS(t *testing.T) { - if !htesting.IsCI() { - t.Skip("skip (relative) long running modules test when running locally") - } - - wd, _ := os.Getwd() - defer func() { - os.Chdir(wd) - }() - - c := qt.New(t) - - packageJSON := `{ - "scripts": {}, - - "devDependencies": { - "postcss-cli": "7.1.0", - "tailwindcss": "1.2.0" - } -} -` - - postcssConfig := ` -console.error("Hugo Environment:", process.env.HUGO_ENVIRONMENT ); -// https://github.com/gohugoio/hugo/issues/7656 -console.error("package.json:", process.env.HUGO_FILE_PACKAGE_JSON ); -console.error("PostCSS Config File:", process.env.HUGO_FILE_POSTCSS_CONFIG_JS ); - - -module.exports = { - plugins: [ - require('tailwindcss') - ] -} -` - - tailwindCss := ` -@tailwind base; -@tailwind components; -@tailwind utilities; - -@import "components/all.css"; - -h1 { - @apply text-2xl font-bold; -} - -` - - workDir, clean, err := htesting.CreateTempDir(hugofs.Os, "hugo-test-postcss") - c.Assert(err, qt.IsNil) - defer clean() - - var logBuf bytes.Buffer - - newTestBuilder := func(v config.Provider) *sitesBuilder { - v.Set("workingDir", workDir) - v.Set("disableKinds", []string{"taxonomy", "term", "page"}) - logger := loggers.NewBasicLoggerForWriter(jww.LevelInfo, &logBuf) - b := newTestSitesBuilder(t).WithLogger(logger) - // Need to use OS fs for this. - b.Fs = hugofs.NewDefault(v) - b.WithWorkingDir(workDir) - b.WithViper(v) - - b.WithContent("p1.md", "") - b.WithTemplates("index.html", ` -{{ $options := dict "inlineImports" true }} -{{ $styles := resources.Get "css/styles.css" | resources.PostCSS $options }} -Styles RelPermalink: {{ $styles.RelPermalink }} -{{ $cssContent := $styles.Content }} -Styles Content: Len: {{ len $styles.Content }}| - -`) - - return b - } - - b := newTestBuilder(config.New()) - - cssDir := filepath.Join(workDir, "assets", "css", "components") - b.Assert(os.MkdirAll(cssDir, 0777), qt.IsNil) - - b.WithSourceFile("assets/css/styles.css", tailwindCss) - b.WithSourceFile("assets/css/components/all.css", ` -@import "a.css"; -@import "b.css"; -`, "assets/css/components/a.css", ` -class-in-a { - color: blue; -} -`, "assets/css/components/b.css", ` -@import "a.css"; - -class-in-b { - color: blue; -} -`) - - b.WithSourceFile("package.json", packageJSON) - b.WithSourceFile("postcss.config.js", postcssConfig) - - b.Assert(os.Chdir(workDir), qt.IsNil) - cmd := b.NpmInstall() - err = cmd.Run() - b.Assert(err, qt.IsNil) - b.Build(BuildCfg{}) - - // Make sure Node sees this. - b.Assert(logBuf.String(), qt.Contains, "Hugo Environment: production") - b.Assert(logBuf.String(), qt.Contains, filepath.FromSlash(fmt.Sprintf("PostCSS Config File: %s/postcss.config.js", workDir))) - b.Assert(logBuf.String(), qt.Contains, filepath.FromSlash(fmt.Sprintf("package.json: %s/package.json", workDir))) - - b.AssertFileContent("public/index.html", ` -Styles RelPermalink: /css/styles.css -Styles Content: Len: 770878| -`) - - assertCss := func(b *sitesBuilder) { - content := b.FileContent("public/css/styles.css") - - b.Assert(strings.Contains(content, "class-in-a"), qt.Equals, true) - b.Assert(strings.Contains(content, "class-in-b"), qt.Equals, true) - } - - assertCss(b) - - build := func(s string, shouldFail bool) error { - b.Assert(os.RemoveAll(filepath.Join(workDir, "public")), qt.IsNil) - - v := config.New() - v.Set("build", map[string]interface{}{ - "useResourceCacheWhen": s, - }) - - b = newTestBuilder(v) - - b.Assert(os.RemoveAll(filepath.Join(workDir, "public")), qt.IsNil) - - err := b.BuildE(BuildCfg{}) - if shouldFail { - b.Assert(err, qt.Not(qt.IsNil)) - } else { - b.Assert(err, qt.IsNil) - assertCss(b) - } - - return err - } - - build("always", false) - build("fallback", false) - - // Introduce a syntax error in an import - b.WithSourceFile("assets/css/components/b.css", `@import "a.css"; - -class-in-b { - @apply asdf; -} -`) - - err = build("never", true) - - err = herrors.UnwrapErrorWithFileContext(err) - _, ok := err.(*herrors.ErrorWithFileContext) - b.Assert(ok, qt.Equals, true) - - // TODO(bep) for some reason, we have starting to get - // execute of template failed: template: index.html:5:25 - // on CI (GitHub action). - // b.Assert(fe.Position().LineNumber, qt.Equals, 5) - // b.Assert(fe.Error(), qt.Contains, filepath.Join(workDir, "assets/css/components/b.css:4:1")) - - // Remove PostCSS - b.Assert(os.RemoveAll(filepath.Join(workDir, "node_modules")), qt.IsNil) - - build("always", false) - build("fallback", false) - build("never", true) - - // Remove cache - b.Assert(os.RemoveAll(filepath.Join(workDir, "resources")), qt.IsNil) - - build("always", true) - build("fallback", true) - build("never", true) -} - func TestResourceMinifyDisabled(t *testing.T) { t.Parallel() diff --git a/resources/resource_transformers/postcss/integration_test.go b/resources/resource_transformers/postcss/integration_test.go new file mode 100644 index 00000000000..5bb1a9ffe1e --- /dev/null +++ b/resources/resource_transformers/postcss/integration_test.go @@ -0,0 +1,148 @@ +// Copyright 2021 The Hugo Authors. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package postcss_test + +import ( + "fmt" + "path/filepath" + "strings" + "testing" + + jww "github.com/spf13/jwalterweatherman" + + qt "github.com/frankban/quicktest" + "github.com/gohugoio/hugo/htesting" + "github.com/gohugoio/hugo/hugolib" +) + +func TestTransformPostCSS(t *testing.T) { + if !htesting.IsCI() { + t.Skip("Skip long running test when running locally") + } + + c := qt.New(t) + + files := ` +-- assets/css/components/a.css -- +class-in-a { + color: blue; +} + +-- assets/css/components/all.css -- +@import "a.css"; +@import "b.css"; +-- assets/css/components/b.css -- +@import "a.css"; + +class-in-b { + color: blue; +} + +-- assets/css/styles.css -- +@tailwind base; +@tailwind components; +@tailwind utilities; +@import "components/all.css"; +h1 { + @apply text-2xl font-bold; +} + +-- config.toml -- +disablekinds = ['taxonomy', 'term', 'page'] +-- content/p1.md -- +-- data/hugo.toml -- +slogan = "Hugo Rocks!" +-- i18n/en.yaml -- +hello: + other: "Hello" +-- i18n/fr.yaml -- +hello: + other: "Bonjour" +-- layouts/index.html -- +{{ $options := dict "inlineImports" true }} +{{ $styles := resources.Get "css/styles.css" | resources.PostCSS $options }} +Styles RelPermalink: {{ $styles.RelPermalink }} +{{ $cssContent := $styles.Content }} +Styles Content: Len: {{ len $styles.Content }}| +-- package.json -- +{ + "scripts": {}, + + "devDependencies": { + "postcss-cli": "7.1.0", + "tailwindcss": "1.2.0" + } +} +-- postcss.config.js -- +console.error("Hugo Environment:", process.env.HUGO_ENVIRONMENT ); +// https://github.com/gohugoio/hugo/issues/7656 +console.error("package.json:", process.env.HUGO_FILE_PACKAGE_JSON ); +console.error("PostCSS Config File:", process.env.HUGO_FILE_POSTCSS_CONFIG_JS ); + +module.exports = { + plugins: [ + require('tailwindcss') + ] +} + +` + + c.Run("Success", func(c *qt.C) { + b := hugolib.NewIntegrationTestBuilder( + hugolib.IntegrationTestConfig{ + T: c, + NeedsOsFS: true, + NeedsNpmInstall: true, + LogLevel: jww.LevelInfo, + TxtarString: files, + }).Build() + + b.AssertLogContains("Hugo Environment: production") + b.AssertLogContains(filepath.FromSlash(fmt.Sprintf("PostCSS Config File: %s/postcss.config.js", b.Cfg.WorkingDir))) + b.AssertLogContains(filepath.FromSlash(fmt.Sprintf("package.json: %s/package.json", b.Cfg.WorkingDir))) + + b.AssertFileContent("public/index.html", ` +Styles RelPermalink: /css/styles.css +Styles Content: Len: 770875| +`) + }) + + c.Run("Error", func(c *qt.C) { + s, err := hugolib.NewIntegrationTestBuilder( + hugolib.IntegrationTestConfig{ + T: c, + NeedsOsFS: true, + NeedsNpmInstall: true, + TxtarString: strings.ReplaceAll(files, "color: blue;", "@apply foo;"), // Syntax error + }).BuildE() + s.AssertIsFileError(err) + }) +} + +// bookmark2 +func TestIntegrationTestTemplate(t *testing.T) { + c := qt.New(t) + + files := `` + + b := hugolib.NewIntegrationTestBuilder( + hugolib.IntegrationTestConfig{ + T: c, + NeedsOsFS: false, + NeedsNpmInstall: false, + TxtarString: files, + }).Build() + + b.Assert(true, qt.IsTrue) +}