1// Copyright 2017 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
14package os
15
16import (
17	"path/filepath"
18	"testing"
19
20	"github.com/gohugoio/hugo/config"
21
22	qt "github.com/frankban/quicktest"
23	"github.com/gohugoio/hugo/deps"
24	"github.com/gohugoio/hugo/hugofs"
25	"github.com/spf13/afero"
26)
27
28func TestReadFile(t *testing.T) {
29	t.Parallel()
30	c := qt.New(t)
31
32	workingDir := "/home/hugo"
33
34	v := config.New()
35	v.Set("workingDir", workingDir)
36
37	// f := newTestFuncsterWithViper(v)
38	ns := New(&deps.Deps{Fs: hugofs.NewMem(v)})
39
40	afero.WriteFile(ns.deps.Fs.Source, filepath.Join(workingDir, "/f/f1.txt"), []byte("f1-content"), 0755)
41	afero.WriteFile(ns.deps.Fs.Source, filepath.Join("/home", "f2.txt"), []byte("f2-content"), 0755)
42
43	for _, test := range []struct {
44		filename string
45		expect   interface{}
46	}{
47		{filepath.FromSlash("/f/f1.txt"), "f1-content"},
48		{filepath.FromSlash("f/f1.txt"), "f1-content"},
49		{filepath.FromSlash("../f2.txt"), false},
50		{"", false},
51		{"b", false},
52	} {
53
54		result, err := ns.ReadFile(test.filename)
55
56		if b, ok := test.expect.(bool); ok && !b {
57			c.Assert(err, qt.Not(qt.IsNil))
58			continue
59		}
60
61		c.Assert(err, qt.IsNil)
62		c.Assert(result, qt.Equals, test.expect)
63	}
64}
65
66func TestFileExists(t *testing.T) {
67	t.Parallel()
68	c := qt.New(t)
69
70	workingDir := "/home/hugo"
71
72	v := config.New()
73	v.Set("workingDir", workingDir)
74
75	ns := New(&deps.Deps{Fs: hugofs.NewMem(v)})
76
77	afero.WriteFile(ns.deps.Fs.Source, filepath.Join(workingDir, "/f/f1.txt"), []byte("f1-content"), 0755)
78	afero.WriteFile(ns.deps.Fs.Source, filepath.Join("/home", "f2.txt"), []byte("f2-content"), 0755)
79
80	for _, test := range []struct {
81		filename string
82		expect   interface{}
83	}{
84		{filepath.FromSlash("/f/f1.txt"), true},
85		{filepath.FromSlash("f/f1.txt"), true},
86		{filepath.FromSlash("../f2.txt"), false},
87		{"b", false},
88		{"", nil},
89	} {
90		result, err := ns.FileExists(test.filename)
91
92		if test.expect == nil {
93			c.Assert(err, qt.Not(qt.IsNil))
94			continue
95		}
96
97		c.Assert(err, qt.IsNil)
98		c.Assert(result, qt.Equals, test.expect)
99	}
100}
101
102func TestStat(t *testing.T) {
103	t.Parallel()
104	c := qt.New(t)
105	workingDir := "/home/hugo"
106
107	v := config.New()
108	v.Set("workingDir", workingDir)
109
110	ns := New(&deps.Deps{Fs: hugofs.NewMem(v)})
111
112	afero.WriteFile(ns.deps.Fs.Source, filepath.Join(workingDir, "/f/f1.txt"), []byte("f1-content"), 0755)
113
114	for _, test := range []struct {
115		filename string
116		expect   interface{}
117	}{
118		{filepath.FromSlash("/f/f1.txt"), int64(10)},
119		{filepath.FromSlash("f/f1.txt"), int64(10)},
120		{"b", nil},
121		{"", nil},
122	} {
123		result, err := ns.Stat(test.filename)
124
125		if test.expect == nil {
126			c.Assert(err, qt.Not(qt.IsNil))
127			continue
128		}
129
130		c.Assert(err, qt.IsNil)
131		c.Assert(result.Size(), qt.Equals, test.expect)
132	}
133}
134