github.com/dominikszabo/hugo-ds-clean@v0.47.1/hugofs/language_composite_fs_test.go (about) 1 // Copyright 2018 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 hugofs 15 16 import ( 17 "path/filepath" 18 19 "strings" 20 21 "testing" 22 23 "github.com/spf13/afero" 24 "github.com/stretchr/testify/require" 25 ) 26 27 func TestCompositeLanguagFsTest(t *testing.T) { 28 assert := require.New(t) 29 30 languages := map[string]bool{ 31 "sv": true, 32 "en": true, 33 "nn": true, 34 } 35 msv := afero.NewMemMapFs() 36 baseSv := "/content/sv" 37 lfssv := NewLanguageFs("sv", languages, afero.NewBasePathFs(msv, baseSv)) 38 mnn := afero.NewMemMapFs() 39 baseNn := "/content/nn" 40 lfsnn := NewLanguageFs("nn", languages, afero.NewBasePathFs(mnn, baseNn)) 41 men := afero.NewMemMapFs() 42 baseEn := "/content/en" 43 lfsen := NewLanguageFs("en", languages, afero.NewBasePathFs(men, baseEn)) 44 45 // The order will be sv, en, nn 46 composite := NewLanguageCompositeFs(lfsnn, lfsen) 47 composite = NewLanguageCompositeFs(composite, lfssv) 48 49 afero.WriteFile(msv, filepath.Join(baseSv, "f1.txt"), []byte("some sv"), 0755) 50 afero.WriteFile(mnn, filepath.Join(baseNn, "f1.txt"), []byte("some nn"), 0755) 51 afero.WriteFile(men, filepath.Join(baseEn, "f1.txt"), []byte("some en"), 0755) 52 53 // Swedish is the top layer. 54 assertLangFile(t, composite, "f1.txt", "sv") 55 56 afero.WriteFile(msv, filepath.Join(baseSv, "f2.en.txt"), []byte("some sv"), 0755) 57 afero.WriteFile(mnn, filepath.Join(baseNn, "f2.en.txt"), []byte("some nn"), 0755) 58 afero.WriteFile(men, filepath.Join(baseEn, "f2.en.txt"), []byte("some en"), 0755) 59 60 // English is in the middle, but the most specific language match wins. 61 //assertLangFile(t, composite, "f2.en.txt", "en") 62 63 // Fetch some specific language versions 64 assertLangFile(t, composite, filepath.Join(baseNn, "f2.en.txt"), "nn") 65 assertLangFile(t, composite, filepath.Join(baseEn, "f2.en.txt"), "en") 66 assertLangFile(t, composite, filepath.Join(baseSv, "f2.en.txt"), "sv") 67 68 // Read the root 69 f, err := composite.Open("/") 70 assert.NoError(err) 71 defer f.Close() 72 files, err := f.Readdir(-1) 73 assert.Equal(4, len(files)) 74 expected := map[string]bool{ 75 filepath.FromSlash("/content/en/f1.txt"): true, 76 filepath.FromSlash("/content/nn/f1.txt"): true, 77 filepath.FromSlash("/content/sv/f1.txt"): true, 78 filepath.FromSlash("/content/en/f2.en.txt"): true, 79 } 80 got := make(map[string]bool) 81 82 for _, fi := range files { 83 fil, ok := fi.(*LanguageFileInfo) 84 assert.True(ok) 85 got[fil.Filename()] = true 86 } 87 assert.Equal(expected, got) 88 } 89 90 func assertLangFile(t testing.TB, fs afero.Fs, filename, match string) { 91 f, err := fs.Open(filename) 92 if err != nil { 93 t.Fatal(err) 94 } 95 defer f.Close() 96 b, err := afero.ReadAll(f) 97 if err != nil { 98 t.Fatal(err) 99 } 100 101 s := string(b) 102 if !strings.Contains(s, match) { 103 t.Fatalf("got %q expected it to contain %q", s, match) 104 105 } 106 }