Skip to content

Commit

Permalink
feat: write tests
Browse files Browse the repository at this point in the history
  • Loading branch information
mehran-prs committed May 16, 2024
1 parent 59de2b9 commit 331c2ba
Show file tree
Hide file tree
Showing 11 changed files with 324 additions and 31 deletions.
64 changes: 64 additions & 0 deletions .golangci.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
run:
timeout: 5m

issues:
exclude-dirs:
- lab

linters-settings:
gofmt:
rewrite-rules:
- pattern: 'interface{}'
replacement: 'any'
- pattern: 'a[b:len(a)]'
replacement: 'a[b:]'
revive: # this is recommended config from [here](https://github.com/mgechev/revive#configuration)
rules:
- name: blank-imports
- name: context-as-argument
- name: context-keys-type
- name: dot-imports
- name: error-return
- name: error-strings
- name: error-naming
- name: exported
- name: increment-decrement
- name: var-naming
arguments:
- ["ID","HTTP","HTTPS","SQL","API","URL","URI"] # whitelist
- [] # blacklist
- name: var-declaration
- name: package-comments
- name: range
- name: receiver-naming
- name: time-naming
- name: unexported-return
- name: indent-error-flow
- name: errorf
- name: empty-block
- name: superfluous-else
- name: unused-parameter
- name: unreachable-code
- name: redefines-builtin-id
govet:
enable-all: true
disable:
- fieldalignment

linters:
disable-all: true
enable:
- unused
- gofmt
- revive
- gosimple
- govet
- ineffassign
- exportloopref
- staticcheck
- unconvert
- unused
- misspell
- goimports
- errcheck

20 changes: 20 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
@@ -1 +1,21 @@
Snip helps you manage snippets in cmd.


### Some commands
```bash
# Run tests
go test ./...

# Test coverage
go test -coverprofile cover.out ./...
go tool cover -html cover.out # view as html
go tool cover -func cover.out # output coverage per functions

# Run linters
go install github.com/golangci/golangci-lint/cmd/[email protected]
golangci-lint run ./...

# build
go build -o snip .

```
7 changes: 5 additions & 2 deletions config.go
Original file line number Diff line number Diff line change
Expand Up @@ -26,9 +26,12 @@ type Config struct {
LogTmpFileName string
}

func loadConfig(envPrefix string) (err error) {
func loadConfig(appPrefix string) (err error) {
env := func(name string, def ...string) string {
return DefaultStr(os.Getenv(strings.ToUpper(envPrefix+name)), def...)
return DefaultStr(
os.Getenv(strings.ToUpper(appPrefix+name)),
append([]string{os.Getenv(strings.ToUpper(prefix + name))}, def...)...,
)
}
cfgOnce.Do(func() {
var homeDir string
Expand Down
54 changes: 41 additions & 13 deletions config_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,11 +5,27 @@ import (
"path"
"path/filepath"
"strings"
"sync"
"testing"
)

func setEnv(t *testing.T, key, value string) {
t.Helper()

oldVal := os.Getenv(key)
assertEqual(t, os.Setenv(key, value), nil)
t.Cleanup(func() {
assertEqual(t, os.Setenv(key, oldVal), nil)
})
}

func resetConfigOnce() {
cfgOnce = sync.Once{}
}

func TestLoadDefaultConfig(t *testing.T) {
os.Setenv("EDITOR", "abc")
defer resetConfigOnce()
setEnv(t, "EDITOR", "abc")
// Default Values
homeDir, err := os.UserHomeDir()
assertEqual(t, err, nil)
Expand All @@ -25,16 +41,17 @@ func TestLoadDefaultConfig(t *testing.T) {
assertEqual(t, Cfg.LogTmpFileName, "")
}

func TestLoadDConfig(t *testing.T) {
func TestLoadConfig(t *testing.T) {
defer resetConfigOnce()
// Default Values
assertEqual(t, os.Setenv("TEST_DIR", "/ab/c"), nil)
assertEqual(t, os.Setenv("TEST_FILE_VIEWER_CMD", "touch a"), nil)
assertEqual(t, os.Setenv("TEST_MARKDOWN_VIEWER_CMD", "touch b"), nil)
assertEqual(t, os.Setenv("TEST_EDITOR", "vi"), nil)
assertEqual(t, os.Setenv("TEST_GIT", "abc"), nil)
assertEqual(t, os.Setenv("TEST_EXCLUDE", ".a,.b"), nil)
assertEqual(t, os.Setenv("TEST_VERBOSE", "TRUE"), nil)
assertEqual(t, os.Setenv("TEST_LOG_TMP_FILENAME", "abc.log"), nil)
setEnv(t, "TEST_DIR", "/ab/c")
setEnv(t, "TEST_FILE_VIEWER_CMD", "touch a")
setEnv(t, "TEST_MARKDOWN_VIEWER_CMD", "touch b")
setEnv(t, "TEST_EDITOR", "vi")
setEnv(t, "TEST_GIT", "abc")
setEnv(t, "TEST_EXCLUDE", ".a,.b")
setEnv(t, "TEST_VERBOSE", "TRUE")
setEnv(t, "TEST_LOG_TMP_FILENAME", "abc.log")

assertEqual(t, loadConfig("TEST_"), nil)

Expand All @@ -44,20 +61,31 @@ func TestLoadDConfig(t *testing.T) {
assertEqual(t, Cfg.Editor, "vi")
assertEqual(t, Cfg.Git, "abc")
assertEqualSlice(t, Cfg.Exclude, []string{".a", ".b"})
assertEqual(t, Cfg.Verbose, true)
assertTrue(t, Cfg.Verbose)
assertEqual(t, Cfg.LogTmpFileName, "abc.log")
}

func TestLoadConfigInheritance(t *testing.T) {
defer resetConfigOnce()
setEnv(t, "TEST_DIR", "/ab/c")
setEnv(t, "SNIP_DIR", "/ab/d")
setEnv(t, "SNIP_GIT", "abc")
assertEqual(t, loadConfig("TEST_"), nil)

assertEqual(t, Cfg.Dir, "/ab/c")
assertEqual(t, Cfg.Dir, "/ab/c")
}

func TestConfig_ViewerCmd(t *testing.T) {
Cfg = &Config{
MarkdownViewerCMD: []string{"abc", "def"},
FileViewerCMD: []string{"123", "456"},
FileViewerCMD: []string{"123"},
}

cmd := Cfg.ViewerCmd("abc.md")
assertEqualSlice(t, cmd.Args, []string{"abc", "def", "abc.md"})
cmd = Cfg.ViewerCmd("abc.yaml")
assertEqualSlice(t, cmd.Args, []string{"123", "456", "abc.yaml"})
assertEqualSlice(t, cmd.Args, []string{"123", "abc.yaml"})
}

func TestConfig_SnippetPath(t *testing.T) {
Expand Down
1 change: 0 additions & 1 deletion finder_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,6 @@ func TestBasename(t *testing.T) {

func TestFindFiles(t *testing.T) {
searchDir := t.TempDir()
Cfg = &Config{Dir: searchDir}

paths := []string{
"check.txt",
Expand Down
9 changes: 5 additions & 4 deletions log.go
Original file line number Diff line number Diff line change
Expand Up @@ -10,14 +10,14 @@ import (

var logger = log.New(os.Stderr, "", log.Ldate|log.Ltime|log.Lshortfile)

func Verbose(v ...interface{}) {
func Verbose(v ...any) {
if Cfg.Verbose {
_ = logger.Output(3, fmt.Sprint(v...))
}
}

// Error Log
func Error(v ...interface{}) {
func Error(v ...any) {
_ = logger.Output(3, "ERROR: "+fmt.Sprint(v...))
}

Expand Down Expand Up @@ -52,11 +52,12 @@ func SetLoggerFile(filename string) error {
func CloseLoggerFile(w io.Writer) error {
logFileMu.Lock()
defer logFileMu.Unlock()

if logFile == nil {
return nil
}

logger.SetOutput(w)
return logFile.Close()
oldLogFile := logFile
logFile = nil
return oldLogFile.Close()
}
7 changes: 5 additions & 2 deletions log_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ func TestSetLoggerFile(t *testing.T) {
// Opening valid file
bytes := make([]byte, 100)
f, err := os.CreateTemp("", "abc")
assertTrue(t, err != nil)
assertEqual(t, err, nil)
defer func() {
_ = f.Close()
_ = os.Remove(f.Name())
Expand All @@ -42,7 +42,10 @@ func TestSetLoggerFile(t *testing.T) {
assertTrue(t, err == nil)
assertTrue(t, SetLoggerFile(f.Name()) == nil)
Error("a", "b")
f.Read(bytes)

_, err = f.Read(bytes)
assertEqual(t, err, nil)

assertTrue(t, strings.Contains(string(bytes), ": ab"))
assertTrue(t, CloseLoggerFile(os.Stderr) == nil)
// File must be closed now.
Expand Down
10 changes: 3 additions & 7 deletions main.go
Original file line number Diff line number Diff line change
Expand Up @@ -66,7 +66,7 @@ var editorCmd = &cobra.Command{
var versionCmd = &cobra.Command{
Use: "version",
Short: "Print the version",
Run: func(cmd *cobra.Command, args []string) { fmt.Println(DefaultStr(Version, "unknown")) },
Run: func(*cobra.Command, []string) { fmt.Println(DefaultStr(Version, "unknown")) },
}

func init() {
Expand All @@ -82,11 +82,7 @@ func main() {

// boot boots the app. it loads config for us.
func boot(cmd *cobra.Command, _ []string) error {
envPrefix := prefix
if os.Getenv("SNIP_APP_NAME_AS_ENV_PREFIX") == "true" {
envPrefix = strings.ToUpper(cmd.Root().Name()) + "_" // e.g., SNIP_
}

envPrefix := strings.ToUpper(cmd.Root().Name()) + "_" // e.g., SNIP_
if err := loadConfig(envPrefix); err != nil {
return err
}
Expand Down Expand Up @@ -209,6 +205,6 @@ func CmdSync(_ *cobra.Command, args []string) error {
return Command(Cfg.Git, "-C", Cfg.Dir, "push", "origin").Run()
}

func CmdOpenEditor(_ *cobra.Command, args []string) error {
func CmdOpenEditor(_ *cobra.Command, _ []string) error {
return Command(Cfg.Editor, Cfg.Dir).Run()
}
Loading

0 comments on commit 331c2ba

Please sign in to comment.