Skip to content

Commit

Permalink
fix: storefront snippet validation with sub directories
Browse files Browse the repository at this point in the history
  • Loading branch information
shyim committed Jan 15, 2024
1 parent 5a479bc commit 198b1da
Show file tree
Hide file tree
Showing 2 changed files with 52 additions and 43 deletions.
89 changes: 49 additions & 40 deletions extension/snippet_validator.go
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ import (

func validateStorefrontSnippets(context *ValidationContext) {
rootDir := context.Extension.GetRootDir()
if err := validateStorefrontSnippetsByPath(rootDir, context); err != nil {
if err := validateStorefrontSnippetsByPath(rootDir, rootDir, context); err != nil {
return
}

Expand All @@ -26,78 +26,87 @@ func validateStorefrontSnippets(context *ValidationContext) {
bundlePath = path.Join(bundlePath, extraBundle.Name)
}

if err := validateStorefrontSnippetsByPath(bundlePath, context); err != nil {
if err := validateStorefrontSnippetsByPath(bundlePath, rootDir, context); err != nil {
return
}
}
}

func validateStorefrontSnippetsByPath(extensionRoot string, context *ValidationContext) error {
func validateStorefrontSnippetsByPath(extensionRoot, rootDir string, context *ValidationContext) error {
snippetFolder := path.Join(extensionRoot, "Resources", "snippet")

if _, err := os.Stat(snippetFolder); err != nil {
return nil //nolint:nilerr
}

dirEntries, err := os.ReadDir(snippetFolder)
if err != nil {
return err
}

files := make([]string, 0)
snippetFiles := make(map[string][]string)

for _, dirEntry := range dirEntries {
if dirEntry.IsDir() {
continue
err := filepath.WalkDir(snippetFolder, func(path string, d os.DirEntry, err error) error {
if d.IsDir() {
return nil
}

if !strings.HasSuffix(dirEntry.Name(), ".json") {
continue
if filepath.Ext(path) != ".json" {
return nil
}

files = append(files, path.Join(snippetFolder, dirEntry.Name()))
}

if len(files) == 1 {
// We have no other file to compare against
return nil
}

var mainFile string
containingFolder := filepath.Dir(path)

for _, file := range files {
if strings.HasSuffix(filepath.Base(file), "en-GB.json") {
mainFile = file
if _, ok := snippetFiles[containingFolder]; !ok {
snippetFiles[containingFolder] = []string{}
}
}

if len(mainFile) == 0 {
context.AddWarning(fmt.Sprintf("No en-GB.json file found in %s, using %s", snippetFolder, files[0]))
mainFile = files[0]
}
snippetFiles[containingFolder] = append(snippetFiles[containingFolder], path)

return nil
})

mainFileContent, err := os.ReadFile(mainFile)
if err != nil {
return err
}

for _, file := range files {
// makes no sense to compare to ourself
if file == mainFile {
for _, files := range snippetFiles {
if len(files) == 1 {
// We have no other file to compare against
continue
}

if err := compareSnippets(mainFileContent, file, context, extensionRoot); err != nil {
var mainFile string

for _, file := range files {
if strings.HasSuffix(filepath.Base(file), "en-GB.json") {
mainFile = file
}
}

if len(mainFile) == 0 {
context.AddWarning(fmt.Sprintf("No en-GB.json file found in %s, using %s", snippetFolder, files[0]))
mainFile = files[0]
}

mainFileContent, err := os.ReadFile(mainFile)
if err != nil {
return err
}

for _, file := range files {
// makes no sense to compare to ourself
if file == mainFile {
continue
}

if err := compareSnippets(mainFileContent, file, context, rootDir); err != nil {
return err
}
}
}

return nil
}

func validateAdministrationSnippets(context *ValidationContext) {
rootDir := context.Extension.GetRootDir()
if err := validateAdministrationByPath(rootDir, context); err != nil {
if err := validateAdministrationByPath(rootDir, rootDir, context); err != nil {
return
}

Expand All @@ -110,13 +119,13 @@ func validateAdministrationSnippets(context *ValidationContext) {
bundlePath = path.Join(bundlePath, extraBundle.Name)
}

if err := validateAdministrationByPath(bundlePath, context); err != nil {
if err := validateAdministrationByPath(bundlePath, rootDir, context); err != nil {
return
}
}
}

func validateAdministrationByPath(extensionRoot string, context *ValidationContext) error {
func validateAdministrationByPath(extensionRoot, rootDir string, context *ValidationContext) error {
adminFolder := path.Join(extensionRoot, "Resources", "app", "administration")

if _, err := os.Stat(adminFolder); err != nil {
Expand Down Expand Up @@ -182,7 +191,7 @@ func validateAdministrationByPath(extensionRoot string, context *ValidationConte
continue
}

if err := compareSnippets(mainFileContent, file, context, extensionRoot); err != nil {
if err := compareSnippets(mainFileContent, file, context, rootDir); err != nil {
return err
}
}
Expand Down
6 changes: 3 additions & 3 deletions extension/snippet_validator_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ func TestSnippetValidateStorefrontByPathOneFileIsIgnored(t *testing.T) {
_ = os.MkdirAll(path.Join(tmpDir, "Resources", "snippet"), os.ModePerm)
_ = os.WriteFile(path.Join(tmpDir, "Resources", "snippet", "storefront.en-GB.json"), []byte(`{}`), os.ModePerm)

assert.NoError(t, validateStorefrontSnippetsByPath(tmpDir, context))
assert.NoError(t, validateStorefrontSnippetsByPath(tmpDir, tmpDir, context))
assert.Len(t, context.errors, 0)
assert.Len(t, context.warnings, 0)
}
Expand All @@ -54,7 +54,7 @@ func TestSnippetValidateStorefrontByPathSameFile(t *testing.T) {
_ = os.WriteFile(path.Join(tmpDir, "Resources", "snippet", "storefront.en-GB.json"), []byte(`{"test": "1"}`), os.ModePerm)
_ = os.WriteFile(path.Join(tmpDir, "Resources", "snippet", "storefront.de-DE.json"), []byte(`{"test": "2"}`), os.ModePerm)

assert.NoError(t, validateStorefrontSnippetsByPath(tmpDir, context))
assert.NoError(t, validateStorefrontSnippetsByPath(tmpDir, tmpDir, context))
assert.Len(t, context.errors, 0)
assert.Len(t, context.warnings, 0)
}
Expand All @@ -71,7 +71,7 @@ func TestSnippetValidateStorefrontByPathTestDifferent(t *testing.T) {
_ = os.WriteFile(path.Join(tmpDir, "Resources", "snippet", "storefront.en-GB.json"), []byte(`{"a": "1"}`), os.ModePerm)
_ = os.WriteFile(path.Join(tmpDir, "Resources", "snippet", "storefront.de-DE.json"), []byte(`{"b": "2"}`), os.ModePerm)

assert.NoError(t, validateStorefrontSnippetsByPath(tmpDir, context))
assert.NoError(t, validateStorefrontSnippetsByPath(tmpDir, tmpDir, context))
assert.Len(t, context.errors, 2)
assert.Len(t, context.warnings, 0)
assert.Equal(t, "Snippet file: Resources/snippet/storefront.de-DE.json, key: /a, is not defined in the main language", context.errors[0])
Expand Down

0 comments on commit 198b1da

Please sign in to comment.