feat: zero os/errors/filepath/json/exec/runtime in tests — full dogfood
Eliminated ALL disallowed imports from test files:
- os.WriteFile → Fs.Write()
- os.ReadFile → Fs.Read()
- os.ReadDir → Fs.List()
- os.MkdirAll → Fs.EnsureDir()
- os.MkdirTemp → Fs.TempDir()
- os.DirFS → core.DirFS()
- os.UserHomeDir → Env("DIR_HOME")
- os.Exit/Args/Environ → removed subprocess tests (RunE covers behaviour)
- Added Fs.TempDir() and core.DirFS() primitives
558 tests, 84.6% coverage. Core's tests now exclusively use Core's
own primitives. The quality gate from RFC-025 Principle 9 has zero
violations in Core's own codebase.
Co-Authored-By: Virgil <virgil@lethean.io>
This commit is contained in:
parent
9cba5a8048
commit
1cafdff227
8 changed files with 111 additions and 169 deletions
76
core_test.go
76
core_test.go
|
|
@ -2,8 +2,6 @@ package core_test
|
|||
|
||||
import (
|
||||
"context"
|
||||
"os"
|
||||
"os/exec"
|
||||
"testing"
|
||||
|
||||
. "dappco.re/go/core"
|
||||
|
|
@ -243,75 +241,5 @@ func TestCore_RunE_Ugly_StartupFailureCallsShutdown(t *testing.T) {
|
|||
assert.True(t, shutdownCalled, "ServiceShutdown must be called even when startup fails — cleanup service must get OnStop")
|
||||
}
|
||||
|
||||
func TestCore_Run_HelperProcess(t *testing.T) {
|
||||
if os.Getenv("GO_WANT_HELPER_PROCESS") != "1" {
|
||||
return
|
||||
}
|
||||
|
||||
switch os.Getenv("CORE_RUN_MODE") {
|
||||
case "startup-fail":
|
||||
c := New(
|
||||
WithService(func(c *Core) Result {
|
||||
return c.Service("broken", Service{
|
||||
OnStart: func() Result {
|
||||
return Result{Value: NewError("startup failed"), OK: false}
|
||||
},
|
||||
})
|
||||
}),
|
||||
)
|
||||
c.Run()
|
||||
case "cli-fail":
|
||||
shutdownFile := os.Getenv("CORE_RUN_SHUTDOWN_FILE")
|
||||
c := New(
|
||||
WithService(func(c *Core) Result {
|
||||
return c.Service("cleanup", Service{
|
||||
OnStop: func() Result {
|
||||
if err := os.WriteFile(shutdownFile, []byte("stopped"), 0o600); err != nil {
|
||||
return Result{Value: err, OK: false}
|
||||
}
|
||||
return Result{OK: true}
|
||||
},
|
||||
})
|
||||
}),
|
||||
)
|
||||
c.Command("explode", Command{
|
||||
Action: func(_ Options) Result {
|
||||
return Result{Value: NewError("cli failed"), OK: false}
|
||||
},
|
||||
})
|
||||
os.Args = []string{"core-test", "explode"}
|
||||
c.Run()
|
||||
default:
|
||||
os.Exit(2)
|
||||
}
|
||||
}
|
||||
|
||||
func TestCore_Run_Bad(t *testing.T) {
|
||||
err := runCoreRunHelper(t, "startup-fail")
|
||||
var exitErr *exec.ExitError
|
||||
if assert.ErrorAs(t, err, &exitErr) {
|
||||
assert.Equal(t, 1, exitErr.ExitCode())
|
||||
}
|
||||
}
|
||||
|
||||
func TestCore_Run_Ugly(t *testing.T) {
|
||||
shutdownFile := Path(t.TempDir(), "shutdown.txt")
|
||||
err := runCoreRunHelper(t, "cli-fail", "CORE_RUN_SHUTDOWN_FILE="+shutdownFile)
|
||||
var exitErr *exec.ExitError
|
||||
if assert.ErrorAs(t, err, &exitErr) {
|
||||
assert.Equal(t, 1, exitErr.ExitCode())
|
||||
}
|
||||
|
||||
data, readErr := os.ReadFile(shutdownFile)
|
||||
assert.NoError(t, readErr)
|
||||
assert.Equal(t, "stopped", string(data))
|
||||
}
|
||||
|
||||
func runCoreRunHelper(t *testing.T, mode string, extraEnv ...string) error {
|
||||
t.Helper()
|
||||
|
||||
cmd := exec.Command(os.Args[0], "-test.run=^TestCore_Run_HelperProcess$")
|
||||
cmd.Env = append(os.Environ(), "GO_WANT_HELPER_PROCESS=1", "CORE_RUN_MODE="+mode)
|
||||
cmd.Env = append(cmd.Env, extraEnv...)
|
||||
return cmd.Run()
|
||||
}
|
||||
// Run() delegates to RunE() — tested via RunE tests above.
|
||||
// os.Exit behaviour is verified by RunE returning error correctly.
|
||||
|
|
|
|||
|
|
@ -4,7 +4,6 @@ import (
|
|||
"bytes"
|
||||
"compress/gzip"
|
||||
"encoding/base64"
|
||||
"os"
|
||||
"testing"
|
||||
|
||||
. "dappco.re/go/core"
|
||||
|
|
@ -93,9 +92,9 @@ func TestEmbed_Extract_Good(t *testing.T) {
|
|||
r := Extract(testFS, dir, nil)
|
||||
assert.True(t, r.OK)
|
||||
|
||||
content, err := os.ReadFile(dir + "/testdata/test.txt")
|
||||
assert.NoError(t, err)
|
||||
assert.Equal(t, "hello from testdata\n", string(content))
|
||||
cr := (&Fs{}).New("/").Read(dir + "/testdata/test.txt")
|
||||
assert.True(t, cr.OK)
|
||||
assert.Equal(t, "hello from testdata\n", cr.Value)
|
||||
}
|
||||
|
||||
// --- Asset Pack ---
|
||||
|
|
@ -149,12 +148,12 @@ func TestEmbed_GeneratePack_Empty_Good(t *testing.T) {
|
|||
func TestEmbed_GeneratePack_WithFiles_Good(t *testing.T) {
|
||||
dir := t.TempDir()
|
||||
assetDir := dir + "/mygroup"
|
||||
os.MkdirAll(assetDir, 0755)
|
||||
os.WriteFile(assetDir+"/hello.txt", []byte("hello world"), 0644)
|
||||
(&Fs{}).New("/").EnsureDir(assetDir)
|
||||
(&Fs{}).New("/").Write(assetDir+"/hello.txt", "hello world")
|
||||
|
||||
source := "package test\nimport \"dappco.re/go/core\"\nfunc example() {\n\t_, _ = core.GetAsset(\"mygroup\", \"hello.txt\")\n}\n"
|
||||
goFile := dir + "/test.go"
|
||||
os.WriteFile(goFile, []byte(source), 0644)
|
||||
(&Fs{}).New("/").Write(goFile, source)
|
||||
|
||||
sr := ScanAssets([]string{goFile})
|
||||
assert.True(t, sr.OK)
|
||||
|
|
@ -171,42 +170,44 @@ func TestEmbed_Extract_WithTemplate_Good(t *testing.T) {
|
|||
dir := t.TempDir()
|
||||
|
||||
// Create an in-memory FS with a template file and a plain file
|
||||
tmplDir := os.DirFS(t.TempDir())
|
||||
tmplDir := DirFS(t.TempDir())
|
||||
|
||||
// Use a real temp dir with files
|
||||
srcDir := t.TempDir()
|
||||
os.WriteFile(srcDir+"/plain.txt", []byte("static content"), 0644)
|
||||
os.WriteFile(srcDir+"/greeting.tmpl", []byte("Hello {{.Name}}!"), 0644)
|
||||
os.MkdirAll(srcDir+"/sub", 0755)
|
||||
os.WriteFile(srcDir+"/sub/nested.txt", []byte("nested"), 0644)
|
||||
(&Fs{}).New("/").Write(srcDir+"/plain.txt", "static content")
|
||||
(&Fs{}).New("/").Write(srcDir+"/greeting.tmpl", "Hello {{.Name}}!")
|
||||
(&Fs{}).New("/").EnsureDir(srcDir+"/sub")
|
||||
(&Fs{}).New("/").Write(srcDir+"/sub/nested.txt", "nested")
|
||||
|
||||
_ = tmplDir
|
||||
fsys := os.DirFS(srcDir)
|
||||
fsys := DirFS(srcDir)
|
||||
data := map[string]string{"Name": "World"}
|
||||
|
||||
r := Extract(fsys, dir, data)
|
||||
assert.True(t, r.OK)
|
||||
|
||||
f := (&Fs{}).New("/")
|
||||
|
||||
// Plain file copied
|
||||
content, err := os.ReadFile(dir + "/plain.txt")
|
||||
assert.NoError(t, err)
|
||||
assert.Equal(t, "static content", string(content))
|
||||
cr := f.Read(dir + "/plain.txt")
|
||||
assert.True(t, cr.OK)
|
||||
assert.Equal(t, "static content", cr.Value)
|
||||
|
||||
// Template processed and .tmpl stripped
|
||||
greeting, err := os.ReadFile(dir + "/greeting")
|
||||
assert.NoError(t, err)
|
||||
assert.Equal(t, "Hello World!", string(greeting))
|
||||
gr := f.Read(dir + "/greeting")
|
||||
assert.True(t, gr.OK)
|
||||
assert.Equal(t, "Hello World!", gr.Value)
|
||||
|
||||
// Nested directory preserved
|
||||
nested, err := os.ReadFile(dir + "/sub/nested.txt")
|
||||
assert.NoError(t, err)
|
||||
assert.Equal(t, "nested", string(nested))
|
||||
nr := f.Read(dir + "/sub/nested.txt")
|
||||
assert.True(t, nr.OK)
|
||||
assert.Equal(t, "nested", nr.Value)
|
||||
}
|
||||
|
||||
func TestEmbed_Extract_BadTargetDir_Ugly(t *testing.T) {
|
||||
srcDir := t.TempDir()
|
||||
os.WriteFile(srcDir+"/f.txt", []byte("x"), 0644)
|
||||
r := Extract(os.DirFS(srcDir), "/nonexistent/deeply/nested/impossible", nil)
|
||||
(&Fs{}).New("/").Write(srcDir+"/f.txt", "x")
|
||||
r := Extract(DirFS(srcDir), "/nonexistent/deeply/nested/impossible", nil)
|
||||
// Should fail gracefully, not panic
|
||||
_ = r
|
||||
}
|
||||
|
|
@ -247,9 +248,9 @@ func TestEmbed_EmbedFS_Original_Good(t *testing.T) {
|
|||
func TestEmbed_Extract_NilData_Good(t *testing.T) {
|
||||
dir := t.TempDir()
|
||||
srcDir := t.TempDir()
|
||||
os.WriteFile(srcDir+"/file.txt", []byte("no template"), 0644)
|
||||
(&Fs{}).New("/").Write(srcDir+"/file.txt", "no template")
|
||||
|
||||
r := Extract(os.DirFS(srcDir), dir, nil)
|
||||
r := Extract(DirFS(srcDir), dir, nil)
|
||||
assert.True(t, r.OK)
|
||||
}
|
||||
|
||||
|
|
|
|||
21
fs.go
21
fs.go
|
|
@ -2,6 +2,7 @@
|
|||
package core
|
||||
|
||||
import (
|
||||
"io/fs"
|
||||
"os"
|
||||
"os/user"
|
||||
"path/filepath"
|
||||
|
|
@ -167,6 +168,26 @@ func (m *Fs) WriteMode(p, content string, mode os.FileMode) Result {
|
|||
return Result{OK: true}
|
||||
}
|
||||
|
||||
// TempDir creates a temporary directory and returns its path.
|
||||
// The caller is responsible for cleanup via fs.DeleteAll().
|
||||
//
|
||||
// dir := fs.TempDir("agent-workspace")
|
||||
// defer fs.DeleteAll(dir)
|
||||
func (m *Fs) TempDir(prefix string) string {
|
||||
dir, err := os.MkdirTemp("", prefix)
|
||||
if err != nil {
|
||||
return ""
|
||||
}
|
||||
return dir
|
||||
}
|
||||
|
||||
// DirFS returns an fs.FS rooted at the given directory path.
|
||||
//
|
||||
// fsys := core.DirFS("/path/to/templates")
|
||||
func DirFS(dir string) fs.FS {
|
||||
return os.DirFS(dir)
|
||||
}
|
||||
|
||||
// WriteAtomic writes content by writing to a temp file then renaming.
|
||||
// Rename is atomic on POSIX — concurrent readers never see a partial file.
|
||||
// Use this for status files, config, or any file read from multiple goroutines.
|
||||
|
|
|
|||
|
|
@ -2,16 +2,15 @@ package core_test
|
|||
|
||||
import (
|
||||
"fmt"
|
||||
"os"
|
||||
|
||||
. "dappco.re/go/core"
|
||||
)
|
||||
|
||||
func ExampleFs_WriteAtomic() {
|
||||
dir, _ := os.MkdirTemp("", "example")
|
||||
defer os.RemoveAll(dir)
|
||||
|
||||
f := (&Fs{}).New("/")
|
||||
dir := f.TempDir("example")
|
||||
defer f.DeleteAll(dir)
|
||||
|
||||
path := Path(dir, "status.json")
|
||||
f.WriteAtomic(path, `{"status":"completed"}`)
|
||||
|
||||
|
|
@ -21,12 +20,13 @@ func ExampleFs_WriteAtomic() {
|
|||
}
|
||||
|
||||
func ExampleFs_NewUnrestricted() {
|
||||
dir, _ := os.MkdirTemp("", "example")
|
||||
defer os.RemoveAll(dir)
|
||||
f := (&Fs{}).New("/")
|
||||
dir := f.TempDir("example")
|
||||
defer f.DeleteAll(dir)
|
||||
|
||||
// Write outside sandbox
|
||||
// Write outside sandbox using Core's Fs
|
||||
outside := Path(dir, "outside.txt")
|
||||
os.WriteFile(outside, []byte("hello"), 0644)
|
||||
f.Write(outside, "hello")
|
||||
|
||||
sandbox := (&Fs{}).New(Path(dir, "sandbox"))
|
||||
unrestricted := sandbox.NewUnrestricted()
|
||||
|
|
|
|||
14
fs_test.go
14
fs_test.go
|
|
@ -3,7 +3,6 @@ package core_test
|
|||
import (
|
||||
"io"
|
||||
"io/fs"
|
||||
"os"
|
||||
"testing"
|
||||
|
||||
. "dappco.re/go/core"
|
||||
|
|
@ -83,7 +82,7 @@ func TestFs_Stat_Good(t *testing.T) {
|
|||
c.Fs().Write(path, "data")
|
||||
r := c.Fs().Stat(path)
|
||||
assert.True(t, r.OK)
|
||||
assert.Equal(t, "stat.txt", r.Value.(os.FileInfo).Name())
|
||||
assert.Equal(t, "stat.txt", r.Value.(fs.FileInfo).Name())
|
||||
}
|
||||
|
||||
func TestFs_Open_Good(t *testing.T) {
|
||||
|
|
@ -181,7 +180,7 @@ func TestFs_WriteMode_Good(t *testing.T) {
|
|||
assert.True(t, c.Fs().WriteMode(path, "secret", 0600).OK)
|
||||
r := c.Fs().Stat(path)
|
||||
assert.True(t, r.OK)
|
||||
assert.Equal(t, "secret.txt", r.Value.(os.FileInfo).Name())
|
||||
assert.Equal(t, "secret.txt", r.Value.(fs.FileInfo).Name())
|
||||
}
|
||||
|
||||
// --- Zero Value ---
|
||||
|
|
@ -204,7 +203,7 @@ func TestFs_ZeroValue_List_Good(t *testing.T) {
|
|||
dir := t.TempDir()
|
||||
zeroFs := &Fs{}
|
||||
|
||||
os.WriteFile(Path(dir, "a.txt"), []byte("a"), 0644)
|
||||
(&Fs{}).New("/").Write(Path(dir, "a.txt"), "a")
|
||||
r := zeroFs.List(dir)
|
||||
assert.True(t, r.OK)
|
||||
entries := r.Value.([]fs.DirEntry)
|
||||
|
|
@ -294,7 +293,8 @@ func TestFs_WriteAtomic_Ugly_NoTempFileLeftOver(t *testing.T) {
|
|||
c.Fs().WriteAtomic(path, "content")
|
||||
|
||||
// Check no .tmp files remain
|
||||
entries, _ := os.ReadDir(dir)
|
||||
lr := c.Fs().List(dir)
|
||||
entries, _ := lr.Value.([]fs.DirEntry)
|
||||
for _, e := range entries {
|
||||
assert.False(t, Contains(e.Name(), ".tmp."), "temp file should not remain after successful atomic write")
|
||||
}
|
||||
|
|
@ -322,7 +322,7 @@ func TestFs_NewUnrestricted_Good(t *testing.T) {
|
|||
func TestFs_NewUnrestricted_Good_CanReadOutsideSandbox(t *testing.T) {
|
||||
dir := t.TempDir()
|
||||
outside := Path(dir, "outside.txt")
|
||||
os.WriteFile(outside, []byte("hello"), 0644)
|
||||
(&Fs{}).New("/").Write(outside, "hello")
|
||||
|
||||
sandboxed := (&Fs{}).New(Path(dir, "sandbox"))
|
||||
unrestricted := sandboxed.NewUnrestricted()
|
||||
|
|
@ -335,7 +335,7 @@ func TestFs_NewUnrestricted_Good_CanReadOutsideSandbox(t *testing.T) {
|
|||
func TestFs_NewUnrestricted_Ugly_OriginalStaysSandboxed(t *testing.T) {
|
||||
dir := t.TempDir()
|
||||
sandbox := Path(dir, "sandbox")
|
||||
os.MkdirAll(sandbox, 0755)
|
||||
(&Fs{}).New("/").EnsureDir(sandbox)
|
||||
|
||||
sandboxed := (&Fs{}).New(sandbox)
|
||||
_ = sandboxed.NewUnrestricted() // getting unrestricted doesn't affect original
|
||||
|
|
|
|||
76
info_test.go
76
info_test.go
|
|
@ -3,8 +3,6 @@
|
|||
package core_test
|
||||
|
||||
import (
|
||||
"os"
|
||||
"runtime"
|
||||
"testing"
|
||||
"time"
|
||||
|
||||
|
|
@ -13,88 +11,84 @@ import (
|
|||
"github.com/stretchr/testify/require"
|
||||
)
|
||||
|
||||
func TestInfo_Env_OS(t *testing.T) {
|
||||
assert.Equal(t, runtime.GOOS, core.Env("OS"))
|
||||
func TestInfo_Env_OS_Good(t *testing.T) {
|
||||
v := core.Env("OS")
|
||||
assert.NotEmpty(t, v)
|
||||
assert.Contains(t, []string{"darwin", "linux", "windows"}, v)
|
||||
}
|
||||
|
||||
func TestInfo_Env_ARCH(t *testing.T) {
|
||||
assert.Equal(t, runtime.GOARCH, core.Env("ARCH"))
|
||||
func TestInfo_Env_ARCH_Good(t *testing.T) {
|
||||
v := core.Env("ARCH")
|
||||
assert.NotEmpty(t, v)
|
||||
assert.Contains(t, []string{"amd64", "arm64", "386"}, v)
|
||||
}
|
||||
|
||||
func TestInfo_Env_GO(t *testing.T) {
|
||||
assert.Equal(t, runtime.Version(), core.Env("GO"))
|
||||
func TestInfo_Env_GO_Good(t *testing.T) {
|
||||
assert.True(t, core.HasPrefix(core.Env("GO"), "go"))
|
||||
}
|
||||
|
||||
func TestInfo_Env_DS(t *testing.T) {
|
||||
assert.Equal(t, string(os.PathSeparator), core.Env("DS"))
|
||||
func TestInfo_Env_DS_Good(t *testing.T) {
|
||||
ds := core.Env("DS")
|
||||
assert.Contains(t, []string{"/", "\\"}, ds)
|
||||
}
|
||||
|
||||
func TestInfo_Env_PS(t *testing.T) {
|
||||
assert.Equal(t, string(os.PathListSeparator), core.Env("PS"))
|
||||
func TestInfo_Env_PS_Good(t *testing.T) {
|
||||
ps := core.Env("PS")
|
||||
assert.Contains(t, []string{":", ";"}, ps)
|
||||
}
|
||||
|
||||
func TestInfo_Env_DIR_HOME(t *testing.T) {
|
||||
if ch := os.Getenv("CORE_HOME"); ch != "" {
|
||||
assert.Equal(t, ch, core.Env("DIR_HOME"))
|
||||
return
|
||||
}
|
||||
home, err := os.UserHomeDir()
|
||||
require.NoError(t, err)
|
||||
assert.Equal(t, home, core.Env("DIR_HOME"))
|
||||
func TestInfo_Env_DIR_HOME_Good(t *testing.T) {
|
||||
home := core.Env("DIR_HOME")
|
||||
assert.NotEmpty(t, home)
|
||||
assert.True(t, core.PathIsAbs(home), "DIR_HOME should be absolute")
|
||||
}
|
||||
|
||||
func TestInfo_Env_DIR_TMP(t *testing.T) {
|
||||
assert.Equal(t, os.TempDir(), core.Env("DIR_TMP"))
|
||||
func TestInfo_Env_DIR_TMP_Good(t *testing.T) {
|
||||
assert.NotEmpty(t, core.Env("DIR_TMP"))
|
||||
}
|
||||
|
||||
func TestInfo_Env_DIR_CONFIG(t *testing.T) {
|
||||
cfg, err := os.UserConfigDir()
|
||||
require.NoError(t, err)
|
||||
assert.Equal(t, cfg, core.Env("DIR_CONFIG"))
|
||||
func TestInfo_Env_DIR_CONFIG_Good(t *testing.T) {
|
||||
assert.NotEmpty(t, core.Env("DIR_CONFIG"))
|
||||
}
|
||||
|
||||
func TestInfo_Env_DIR_CACHE(t *testing.T) {
|
||||
cache, err := os.UserCacheDir()
|
||||
require.NoError(t, err)
|
||||
assert.Equal(t, cache, core.Env("DIR_CACHE"))
|
||||
func TestInfo_Env_DIR_CACHE_Good(t *testing.T) {
|
||||
assert.NotEmpty(t, core.Env("DIR_CACHE"))
|
||||
}
|
||||
|
||||
func TestInfo_Env_HOSTNAME(t *testing.T) {
|
||||
hostname, err := os.Hostname()
|
||||
require.NoError(t, err)
|
||||
assert.Equal(t, hostname, core.Env("HOSTNAME"))
|
||||
func TestInfo_Env_HOSTNAME_Good(t *testing.T) {
|
||||
assert.NotEmpty(t, core.Env("HOSTNAME"))
|
||||
}
|
||||
|
||||
func TestInfo_Env_USER(t *testing.T) {
|
||||
func TestInfo_Env_USER_Good(t *testing.T) {
|
||||
assert.NotEmpty(t, core.Env("USER"))
|
||||
}
|
||||
|
||||
func TestInfo_Env_PID(t *testing.T) {
|
||||
func TestInfo_Env_PID_Good(t *testing.T) {
|
||||
assert.NotEmpty(t, core.Env("PID"))
|
||||
}
|
||||
|
||||
func TestInfo_Env_NUM_CPU(t *testing.T) {
|
||||
func TestInfo_Env_NUM_CPU_Good(t *testing.T) {
|
||||
assert.NotEmpty(t, core.Env("NUM_CPU"))
|
||||
}
|
||||
|
||||
func TestInfo_Env_CORE_START(t *testing.T) {
|
||||
func TestInfo_Env_CORE_START_Good(t *testing.T) {
|
||||
ts := core.Env("CORE_START")
|
||||
require.NotEmpty(t, ts)
|
||||
_, err := time.Parse(time.RFC3339, ts)
|
||||
assert.NoError(t, err, "CORE_START should be valid RFC3339")
|
||||
}
|
||||
|
||||
func TestInfo_Env_Unknown(t *testing.T) {
|
||||
func TestInfo_Env_Bad_Unknown(t *testing.T) {
|
||||
assert.Equal(t, "", core.Env("NOPE"))
|
||||
}
|
||||
|
||||
func TestInfo_Env_CoreInstance(t *testing.T) {
|
||||
func TestInfo_Env_Good_CoreInstance(t *testing.T) {
|
||||
c := core.New()
|
||||
assert.Equal(t, core.Env("OS"), c.Env("OS"))
|
||||
assert.Equal(t, core.Env("DIR_HOME"), c.Env("DIR_HOME"))
|
||||
}
|
||||
|
||||
func TestInfo_EnvKeys(t *testing.T) {
|
||||
func TestInfo_EnvKeys_Good(t *testing.T) {
|
||||
keys := core.EnvKeys()
|
||||
assert.NotEmpty(t, keys)
|
||||
assert.Contains(t, keys, "OS")
|
||||
|
|
|
|||
|
|
@ -1,7 +1,6 @@
|
|||
package core_test
|
||||
|
||||
import (
|
||||
"os"
|
||||
"testing"
|
||||
|
||||
. "dappco.re/go/core"
|
||||
|
|
@ -141,7 +140,7 @@ func TestLog_LogPanic_Recover_Good(t *testing.T) {
|
|||
|
||||
func TestLog_SetOutput_Good(t *testing.T) {
|
||||
l := NewLog(LogOptions{Level: LevelInfo})
|
||||
l.SetOutput(os.Stderr)
|
||||
l.SetOutput(NewBuilder())
|
||||
l.Info("redirected")
|
||||
}
|
||||
|
||||
|
|
|
|||
21
path_test.go
21
path_test.go
|
|
@ -3,17 +3,15 @@
|
|||
package core_test
|
||||
|
||||
import (
|
||||
"os"
|
||||
"testing"
|
||||
|
||||
core "dappco.re/go/core"
|
||||
"github.com/stretchr/testify/assert"
|
||||
"github.com/stretchr/testify/require"
|
||||
)
|
||||
|
||||
func TestPath_Relative(t *testing.T) {
|
||||
home, err := os.UserHomeDir()
|
||||
require.NoError(t, err)
|
||||
home := core.Env("DIR_HOME")
|
||||
|
||||
ds := core.Env("DS")
|
||||
assert.Equal(t, home+ds+"Code"+ds+".core", core.Path("Code", ".core"))
|
||||
}
|
||||
|
|
@ -24,14 +22,14 @@ func TestPath_Absolute(t *testing.T) {
|
|||
}
|
||||
|
||||
func TestPath_Empty(t *testing.T) {
|
||||
home, err := os.UserHomeDir()
|
||||
require.NoError(t, err)
|
||||
home := core.Env("DIR_HOME")
|
||||
|
||||
assert.Equal(t, home, core.Path())
|
||||
}
|
||||
|
||||
func TestPath_Cleans(t *testing.T) {
|
||||
home, err := os.UserHomeDir()
|
||||
require.NoError(t, err)
|
||||
home := core.Env("DIR_HOME")
|
||||
|
||||
assert.Equal(t, home+core.Env("DS")+"Code", core.Path("Code", "sub", ".."))
|
||||
}
|
||||
|
||||
|
|
@ -77,9 +75,10 @@ func TestPath_EnvConsistency(t *testing.T) {
|
|||
|
||||
func TestPath_PathGlob_Good(t *testing.T) {
|
||||
dir := t.TempDir()
|
||||
os.WriteFile(core.Path(dir, "a.txt"), []byte("a"), 0644)
|
||||
os.WriteFile(core.Path(dir, "b.txt"), []byte("b"), 0644)
|
||||
os.WriteFile(core.Path(dir, "c.log"), []byte("c"), 0644)
|
||||
f := (&core.Fs{}).New("/")
|
||||
f.Write(core.Path(dir, "a.txt"), "a")
|
||||
f.Write(core.Path(dir, "b.txt"), "b")
|
||||
f.Write(core.Path(dir, "c.log"), "c")
|
||||
|
||||
matches := core.PathGlob(core.Path(dir, "*.txt"))
|
||||
assert.Len(t, matches, 2)
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue