github.com/abdfnx/gh-api@v0.0.0-20210414084727-f5432eec23b8/internal/config/config_file_test.go (about)

     1  package config
     2  
     3  import (
     4  	"bytes"
     5  	"fmt"
     6  	"os"
     7  	"testing"
     8  
     9  	"github.com/stretchr/testify/assert"
    10  	"gopkg.in/yaml.v3"
    11  )
    12  
    13  func Test_parseConfig(t *testing.T) {
    14  	defer StubConfig(`---
    15  hosts:
    16    github.com:
    17      user: monalisa
    18      oauth_token: OTOKEN
    19  `, "")()
    20  	config, err := parseConfig("config.yml")
    21  	assert.NoError(t, err)
    22  	user, err := config.Get("github.com", "user")
    23  	assert.NoError(t, err)
    24  	assert.Equal(t, "monalisa", user)
    25  	token, err := config.Get("github.com", "oauth_token")
    26  	assert.NoError(t, err)
    27  	assert.Equal(t, "OTOKEN", token)
    28  }
    29  
    30  func Test_parseConfig_multipleHosts(t *testing.T) {
    31  	defer StubConfig(`---
    32  hosts:
    33    example.com:
    34      user: wronguser
    35      oauth_token: NOTTHIS
    36    github.com:
    37      user: monalisa
    38      oauth_token: OTOKEN
    39  `, "")()
    40  	config, err := parseConfig("config.yml")
    41  	assert.NoError(t, err)
    42  	user, err := config.Get("github.com", "user")
    43  	assert.NoError(t, err)
    44  	assert.Equal(t, "monalisa", user)
    45  	token, err := config.Get("github.com", "oauth_token")
    46  	assert.NoError(t, err)
    47  	assert.Equal(t, "OTOKEN", token)
    48  }
    49  
    50  func Test_parseConfig_hostsFile(t *testing.T) {
    51  	defer StubConfig("", `---
    52  github.com:
    53    user: monalisa
    54    oauth_token: OTOKEN
    55  `)()
    56  	config, err := parseConfig("config.yml")
    57  	assert.NoError(t, err)
    58  	user, err := config.Get("github.com", "user")
    59  	assert.NoError(t, err)
    60  	assert.Equal(t, "monalisa", user)
    61  	token, err := config.Get("github.com", "oauth_token")
    62  	assert.NoError(t, err)
    63  	assert.Equal(t, "OTOKEN", token)
    64  }
    65  
    66  func Test_parseConfig_hostFallback(t *testing.T) {
    67  	defer StubConfig(`---
    68  git_protocol: ssh
    69  `, `---
    70  github.com:
    71      user: monalisa
    72      oauth_token: OTOKEN
    73  example.com:
    74      user: wronguser
    75      oauth_token: NOTTHIS
    76      git_protocol: https
    77  `)()
    78  	config, err := parseConfig("config.yml")
    79  	assert.NoError(t, err)
    80  	val, err := config.Get("example.com", "git_protocol")
    81  	assert.NoError(t, err)
    82  	assert.Equal(t, "https", val)
    83  	val, err = config.Get("github.com", "git_protocol")
    84  	assert.NoError(t, err)
    85  	assert.Equal(t, "ssh", val)
    86  	val, err = config.Get("nonexistent.io", "git_protocol")
    87  	assert.NoError(t, err)
    88  	assert.Equal(t, "ssh", val)
    89  }
    90  
    91  func Test_parseConfig_migrateConfig(t *testing.T) {
    92  	defer StubConfig(`---
    93  github.com:
    94    - user: keiyuri
    95      oauth_token: 123456
    96  `, "")()
    97  
    98  	mainBuf := bytes.Buffer{}
    99  	hostsBuf := bytes.Buffer{}
   100  	defer StubWriteConfig(&mainBuf, &hostsBuf)()
   101  	defer StubBackupConfig()()
   102  
   103  	_, err := parseConfig("config.yml")
   104  	assert.NoError(t, err)
   105  
   106  	expectedHosts := `github.com:
   107      user: keiyuri
   108      oauth_token: "123456"
   109  `
   110  
   111  	assert.Equal(t, expectedHosts, hostsBuf.String())
   112  	assert.NotContains(t, mainBuf.String(), "github.com")
   113  	assert.NotContains(t, mainBuf.String(), "oauth_token")
   114  }
   115  
   116  func Test_parseConfigFile(t *testing.T) {
   117  	tests := []struct {
   118  		contents string
   119  		wantsErr bool
   120  	}{
   121  		{
   122  			contents: "",
   123  			wantsErr: true,
   124  		},
   125  		{
   126  			contents: " ",
   127  			wantsErr: false,
   128  		},
   129  		{
   130  			contents: "\n",
   131  			wantsErr: false,
   132  		},
   133  	}
   134  
   135  	for _, tt := range tests {
   136  		t.Run(fmt.Sprintf("contents: %q", tt.contents), func(t *testing.T) {
   137  			defer StubConfig(tt.contents, "")()
   138  			_, yamlRoot, err := parseConfigFile("config.yml")
   139  			if tt.wantsErr != (err != nil) {
   140  				t.Fatalf("got error: %v", err)
   141  			}
   142  			if tt.wantsErr {
   143  				return
   144  			}
   145  			assert.Equal(t, yaml.MappingNode, yamlRoot.Content[0].Kind)
   146  			assert.Equal(t, 0, len(yamlRoot.Content[0].Content))
   147  		})
   148  	}
   149  }
   150  
   151  func Test_ConfigDir(t *testing.T) {
   152  	tests := []struct {
   153  		envVar string
   154  		want   string
   155  	}{
   156  		{"/tmp/gh", ".tmp.gh"},
   157  		{"", ".config.gh"},
   158  	}
   159  
   160  	for _, tt := range tests {
   161  		t.Run(fmt.Sprintf("envVar: %q", tt.envVar), func(t *testing.T) {
   162  			if tt.envVar != "" {
   163  				os.Setenv(GH_CONFIG_DIR, tt.envVar)
   164  				defer os.Unsetenv(GH_CONFIG_DIR)
   165  			}
   166  			assert.Regexp(t, tt.want, ConfigDir())
   167  		})
   168  	}
   169  }