repo_description: cheat allows you to create and view interactive cheatsheets on the command-line. It was designed to help remind *nix system administrators of options for commands that they use frequently, but not frequently enough to remember.
repo_topics: bash cheat cheatsheet cheatsheets documentation help interactive-cheatsheets man-page
code: package config
  
  import (
  	"path/filepath"
  	"reflect"
  	"runtime"
  	"testing"
  
  	"github.com/davecgh/go-spew/spew"
  )
  
  // TestValidatePathsNix asserts that the proper config paths are returned on
  // *nix platforms
  func TestValidatePathsNix(t *testing.T) {
  	if runtime.GOOS == "windows" {
  		t.Skip("filepath.Join uses backslashes on Windows")
  	}
  
  	// mock the user's home directory
  	home := "/home/foo"
  
  	// mock some envvars
  	envvars := map[string]string{
  		"XDG_CONFIG_HOME": "/home/bar",
  	}
  
  	// specify the platforms to test
  	oses := []string{
  		"android",
  		"darwin",
  		"freebsd",
  		"linux",
  	}
  
  	// test each *nix os
  	for _, os := range oses {
  		// get the paths for the platform
  		paths, err := Paths(os, home, envvars)
  		if err != nil {
  			t.Errorf("paths returned an error: %v", err)
  		}
  
  		// specify the expected output
  		want := []string{
  			"/home/bar/cheat/conf.yml",
  			"/home/foo/.config/cheat/conf.yml",
  			"/home/foo/.cheat/conf.yml",
  			"/etc/cheat/conf.yml",
  		}
  
  		// assert that output matches expectations
  		if !reflect.DeepEqual(paths, want) {
  			t.Errorf(
  				"failed to return expected paths: want:\n%s, got:\n%s",
  				spew.Sdump(want),
  				spew.Sdump(paths),
  			)
  		}
  	}
  }
  
  // TestValidatePathsNixNoXDG asserts that the proper config paths are returned
  // on *nix platforms when `XDG_CONFIG_HOME is not set
  func TestValidatePathsNixNoXDG(t *testing.T) {
  	if runtime.GOOS == "windows" {
  		t.Skip("filepath.Join uses backslashes on Windows")
  	}
  
  	// mock the user's home directory
  	home := "/home/foo"
  
  	// mock some envvars
  	envvars := map[string]string{}
  
  	// specify the platforms to test
  	oses := []string{
  		"darwin",
  		"freebsd",
  		"linux",
  	}
  
  	// test each *nix os
  	for _, os := range oses {
  		// get the paths for the platform
  		paths, err := Paths(os, home, envvars)
  		if err != nil {
  			t.Errorf("paths returned an error: %v", err)
  		}
  
  		// specify the expected output
  		want := []string{
  			"/home/foo/.config/cheat/conf.yml",
  			"/home/foo/.cheat/conf.yml",
  			"/etc/cheat/conf.yml",
  		}
  
  		// assert that output matches expectations
  		if !reflect.DeepEqual(paths, want) {
  			t.Errorf(
  				"failed to return expected paths: want:\n%s, got:\n%s",
  				spew.Sdump(want),
  				spew.Sdump(paths),
  			)
  		}
  	}
  }
  
  // TestValidatePathsWindows asserts that the proper config paths are returned
  // on Windows platforms
  func TestValidatePathsWindows(t *testing.T) {
  
  	// mock the user's home directory
  	home := "not-used-on-windows"
  
  	// mock some envvars
  	envvars := map[string]string{
  		"APPDATA":     filepath.Join("C:", "apps"),
  		"PROGRAMDATA": filepath.Join("C:", "programs"),
  	}
  
  	// get the paths for the platform
  	paths, err := Paths("windows", home, envvars)
  	if err != nil {
  		t.Errorf("paths returned an error: %v", err)
  	}
  
  	// specify the expected output
  	want := []string{
  		filepath.Join("C:", "apps", "cheat", "conf.yml"),
  		filepath.Join("C:", "programs", "cheat", "conf.yml"),
  	}
  
  	// assert that output matches expectations
  	if !reflect.DeepEqual(paths, want) {
  		t.Errorf(
  			"failed to return expected paths: want:\n%s, got:\n%s",
  			spew.Sdump(want),
  			spew.Sdump(paths),
  		)
  	}
  }
  
  // TestValidatePathsUnsupported asserts that an error is returned on
  // unsupported platforms
  func TestValidatePathsUnsupported(t *testing.T) {
  	_, err := Paths("unsupported", "", map[string]string{})
  	if err == nil {
  		t.Errorf("failed to return error on unsupported platform")
  	}
  }
  
  // TestValidatePathsCheatConfigPath asserts that the proper config path is
  // returned when `CHEAT_CONFIG_PATH` is explicitly specified.
  func TestValidatePathsCheatConfigPath(t *testing.T) {
  
  	// mock the user's home directory
  	home := "/home/foo"
  
  	// mock some envvars
  	envvars := map[string]string{
  		"XDG_CONFIG_HOME":   "/home/bar",
  		"CHEAT_CONFIG_PATH": "/home/baz/conf.yml",
  	}
  
  	// get the paths for the platform
  	paths, err := Paths("linux", home, envvars)
  	if err != nil {
  		t.Errorf("paths returned an error: %v", err)
  	}
  
  	// specify the expected output
  	want := []string{
  		"/home/baz/conf.yml",
  	}
  
  	// assert that output matches expectations
  	if !reflect.DeepEqual(paths, want) {
  		t.Errorf(
  			"failed to return expected paths: want:\n%s, got:\n%s",
  			spew.Sdump(want),
  			spew.Sdump(paths),
  		)
  	}
  }
  