Skip to content

Commit bbf5f6d

Browse files
committed
rename config keys: client_id/client_secret → inbox_app_id/inbox_app_secret
Clean break rename across config, auth store, CLI flags, env vars, and all tests. Aligns with HelpScout's own "App ID"/"App Secret" terminology and adds inbox_ prefix to all inbox-specific config keys.
1 parent 73c4cdb commit bbf5f6d

15 files changed

Lines changed: 266 additions & 250 deletions

internal/api/integration_test.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,10 +12,10 @@ import (
1212

1313
func integrationClient(t *testing.T) *Client {
1414
t.Helper()
15-
clientID := os.Getenv("HS_CLIENT_ID")
16-
clientSecret := os.Getenv("HS_CLIENT_SECRET")
15+
clientID := os.Getenv("HS_INBOX_APP_ID")
16+
clientSecret := os.Getenv("HS_INBOX_APP_SECRET")
1717
if clientID == "" || clientSecret == "" {
18-
t.Skip("HS_CLIENT_ID and HS_CLIENT_SECRET required")
18+
t.Skip("HS_INBOX_APP_ID and HS_INBOX_APP_SECRET required")
1919
}
2020
return New(context.Background(), clientID, clientSecret, true)
2121
}

internal/auth/store.go

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -4,28 +4,28 @@ import "github.com/zalando/go-keyring"
44

55
const service = "hs-cli"
66

7-
func StoreCredentials(clientID, clientSecret string) error {
8-
if err := keyring.Set(service, "client_id", clientID); err != nil {
7+
func StoreInboxCredentials(appID, appSecret string) error {
8+
if err := keyring.Set(service, "inbox_app_id", appID); err != nil {
99
return err
1010
}
11-
return keyring.Set(service, "client_secret", clientSecret)
11+
return keyring.Set(service, "inbox_app_secret", appSecret)
1212
}
1313

14-
func LoadCredentials() (clientID, clientSecret string, err error) {
15-
clientID, err = keyring.Get(service, "client_id")
14+
func LoadInboxCredentials() (appID, appSecret string, err error) {
15+
appID, err = keyring.Get(service, "inbox_app_id")
1616
if err != nil {
1717
return "", "", err
1818
}
19-
clientSecret, err = keyring.Get(service, "client_secret")
19+
appSecret, err = keyring.Get(service, "inbox_app_secret")
2020
if err != nil {
2121
return "", "", err
2222
}
23-
return clientID, clientSecret, nil
23+
return appID, appSecret, nil
2424
}
2525

26-
func DeleteCredentials() error {
27-
_ = keyring.Delete(service, "client_id")
28-
_ = keyring.Delete(service, "client_secret")
26+
func DeleteInboxCredentials() error {
27+
_ = keyring.Delete(service, "inbox_app_id")
28+
_ = keyring.Delete(service, "inbox_app_secret")
2929
return nil
3030
}
3131

internal/cmd/cmd_test.go

Lines changed: 34 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -51,12 +51,12 @@ func saveRestore(t *testing.T) {
5151
origVersionStr := versionStr
5252
origUpdateDir := selfupdate.DirOverride
5353
origUpdateResult := updateResult
54-
origSetClientID := setClientID
55-
origSetClientSecret := setClientSecret
56-
origSetDefaultMailbox := setDefaultMailbox
54+
origSetClientID := setInboxAppID
55+
origSetClientSecret := setInboxAppSecret
56+
origSetDefaultMailbox := setInboxMailbox
5757
origSetFormat := setFormat
58-
origSetPIIMode := setPIIMode
59-
origSetPIIAllowRaw := setPIIAllowRaw
58+
origSetPIIMode := setInboxPIIMode
59+
origSetPIIAllowRaw := setInboxPIIAllow
6060

6161
selfupdate.DirOverride = t.TempDir()
6262

@@ -73,12 +73,12 @@ func saveRestore(t *testing.T) {
7373
versionStr = origVersionStr
7474
selfupdate.DirOverride = origUpdateDir
7575
updateResult = origUpdateResult
76-
setClientID = origSetClientID
77-
setClientSecret = origSetClientSecret
78-
setDefaultMailbox = origSetDefaultMailbox
76+
setInboxAppID = origSetClientID
77+
setInboxAppSecret = origSetClientSecret
78+
setInboxMailbox = origSetDefaultMailbox
7979
setFormat = origSetFormat
80-
setPIIMode = origSetPIIMode
81-
setPIIAllowRaw = origSetPIIAllowRaw
80+
setInboxPIIMode = origSetPIIMode
81+
setInboxPIIAllow = origSetPIIAllowRaw
8282
configSetCmd.Flags().VisitAll(func(f *pflag.Flag) {
8383
f.Changed = false
8484
})
@@ -138,8 +138,8 @@ func TestAuthStatus_NotAuthenticated_E2E(t *testing.T) {
138138
_, buf := setupE2E(t)
139139

140140
// No credentials anywhere
141-
t.Setenv("HS_CLIENT_ID", "")
142-
t.Setenv("HS_CLIENT_SECRET", "")
141+
t.Setenv("HS_INBOX_APP_ID", "")
142+
t.Setenv("HS_INBOX_APP_SECRET", "")
143143

144144
rootCmd.SetArgs([]string{"inbox", "auth", "status"})
145145
require.NoError(t, rootCmd.Execute())
@@ -153,17 +153,17 @@ func TestAuthStatus_WithConfigCreds_E2E(t *testing.T) {
153153
// Write config with credentials
154154
cfgFile := filepath.Join(home, ".config", "hs", "config.yaml")
155155
require.NoError(t, config.Save(cfgFile, &config.Config{
156-
ClientID: "test-id-1234abcd",
157-
ClientSecret: "test-secret",
156+
InboxAppID: "test-id-1234abcd",
157+
InboxAppSecret: "test-secret",
158158
}))
159159
cfgPath = cfgFile
160160

161161
// auth status reads from keyring first, then config.
162162
// In isolated env, keyring will fail, so it falls through to config.
163163
// However, the current auth status command only checks keyring via auth.LoadCredentials.
164164
// Let's use env vars instead for a reliable test.
165-
t.Setenv("HS_CLIENT_ID", "test-id-1234abcd")
166-
t.Setenv("HS_CLIENT_SECRET", "test-secret")
165+
t.Setenv("HS_INBOX_APP_ID", "test-id-1234abcd")
166+
t.Setenv("HS_INBOX_APP_SECRET", "test-secret")
167167

168168
// Auth status checks keyring directly, not config.
169169
// In CI/isolated env, keyring will fail. So auth status says "Not authenticated".
@@ -188,15 +188,15 @@ func TestConfigCredentialPath_E2E(t *testing.T) {
188188
home, _ := setupE2E(t)
189189

190190
// Set credentials via env vars (highest priority)
191-
t.Setenv("HS_CLIENT_ID", "env-id-test")
192-
t.Setenv("HS_CLIENT_SECRET", "env-secret-test")
191+
t.Setenv("HS_INBOX_APP_ID", "env-id-test")
192+
t.Setenv("HS_INBOX_APP_SECRET", "env-secret-test")
193193

194194
// Config should pick up env vars
195195
cfgFile := filepath.Join(home, ".config", "hs", "config.yaml")
196196
loaded, err := config.Load(cfgFile)
197197
require.NoError(t, err)
198-
assert.Equal(t, "env-id-test", loaded.ClientID)
199-
assert.Equal(t, "env-secret-test", loaded.ClientSecret)
198+
assert.Equal(t, "env-id-test", loaded.InboxAppID)
199+
assert.Equal(t, "env-secret-test", loaded.InboxAppSecret)
200200
}
201201

202202
func TestConfigFile_E2E(t *testing.T) {
@@ -205,22 +205,22 @@ func TestConfigFile_E2E(t *testing.T) {
205205
// Write config
206206
cfgFile := filepath.Join(home, ".config", "hs", "config.yaml")
207207
require.NoError(t, config.Save(cfgFile, &config.Config{
208-
ClientID: "file-id",
209-
ClientSecret: "file-secret",
210-
DefaultMailbox: 12345,
208+
InboxAppID: "file-id",
209+
InboxAppSecret: "file-secret",
210+
InboxDefaultMailbox: 12345,
211211
Format: "json",
212212
}))
213213

214214
// Clear env vars so config file is used
215-
t.Setenv("HS_CLIENT_ID", "")
216-
t.Setenv("HS_CLIENT_SECRET", "")
215+
t.Setenv("HS_INBOX_APP_ID", "")
216+
t.Setenv("HS_INBOX_APP_SECRET", "")
217217
t.Setenv("HS_FORMAT", "")
218218

219219
loaded, err := config.Load(cfgFile)
220220
require.NoError(t, err)
221-
assert.Equal(t, "file-id", loaded.ClientID)
222-
assert.Equal(t, "file-secret", loaded.ClientSecret)
223-
assert.Equal(t, 12345, loaded.DefaultMailbox)
221+
assert.Equal(t, "file-id", loaded.InboxAppID)
222+
assert.Equal(t, "file-secret", loaded.InboxAppSecret)
223+
assert.Equal(t, 12345, loaded.InboxDefaultMailbox)
224224
assert.Equal(t, "json", loaded.Format)
225225
}
226226

@@ -230,20 +230,20 @@ func TestEnvOverridesConfig_E2E(t *testing.T) {
230230
// Write config with one set of creds
231231
cfgFile := filepath.Join(home, ".config", "hs", "config.yaml")
232232
require.NoError(t, config.Save(cfgFile, &config.Config{
233-
ClientID: "file-id",
234-
ClientSecret: "file-secret",
233+
InboxAppID: "file-id",
234+
InboxAppSecret: "file-secret",
235235
Format: "table",
236236
}))
237237

238238
// Env vars override
239-
t.Setenv("HS_CLIENT_ID", "env-id")
240-
t.Setenv("HS_CLIENT_SECRET", "env-secret")
239+
t.Setenv("HS_INBOX_APP_ID", "env-id")
240+
t.Setenv("HS_INBOX_APP_SECRET", "env-secret")
241241
t.Setenv("HS_FORMAT", "json")
242242

243243
loaded, err := config.Load(cfgFile)
244244
require.NoError(t, err)
245-
assert.Equal(t, "env-id", loaded.ClientID)
246-
assert.Equal(t, "env-secret", loaded.ClientSecret)
245+
assert.Equal(t, "env-id", loaded.InboxAppID)
246+
assert.Equal(t, "env-secret", loaded.InboxAppSecret)
247247
assert.Equal(t, "json", loaded.Format)
248248
}
249249

internal/cmd/config.go

Lines changed: 54 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -10,12 +10,14 @@ import (
1010
)
1111

1212
var (
13-
setClientID string
14-
setClientSecret string
15-
setDefaultMailbox int
16-
setFormat string
17-
setPIIMode string
18-
setPIIAllowRaw bool
13+
setInboxAppID string
14+
setInboxAppSecret string
15+
setInboxMailbox int
16+
setInboxPIIMode string
17+
setInboxPIIAllow bool
18+
setDocsAPIKey string
19+
setDocsPermissions string
20+
setFormat string
1921

2022
configCmd *cobra.Command
2123
configSetCmd *cobra.Command
@@ -41,12 +43,14 @@ func newConfigSetCmd() *cobra.Command {
4143
Short: "Set config values",
4244
RunE: runConfigSet,
4345
}
44-
cmd.Flags().StringVar(&setClientID, "client-id", "", "HelpScout Client ID")
45-
cmd.Flags().StringVar(&setClientSecret, "client-secret", "", "HelpScout Client Secret")
46-
cmd.Flags().IntVar(&setDefaultMailbox, "default-mailbox", 0, "default mailbox ID")
46+
cmd.Flags().StringVar(&setInboxAppID, "inbox-app-id", "", "HelpScout Inbox App ID")
47+
cmd.Flags().StringVar(&setInboxAppSecret, "inbox-app-secret", "", "HelpScout Inbox App Secret")
48+
cmd.Flags().IntVar(&setInboxMailbox, "inbox-default-mailbox", 0, "default mailbox ID")
4749
cmd.Flags().StringVar(&setFormat, "format", "", "output format: table|json|csv")
48-
cmd.Flags().StringVar(&setPIIMode, "pii-mode", "", "PII redaction mode: off|customers|all")
49-
cmd.Flags().BoolVar(&setPIIAllowRaw, "pii-allow-unredacted", false, "allow per-request --unredacted override")
50+
cmd.Flags().StringVar(&setInboxPIIMode, "inbox-pii-mode", "", "PII redaction mode: off|customers|all")
51+
cmd.Flags().BoolVar(&setInboxPIIAllow, "inbox-pii-allow-unredacted", false, "allow per-request --unredacted override")
52+
cmd.Flags().StringVar(&setDocsAPIKey, "docs-api-key", "", "HelpScout Docs API key")
53+
cmd.Flags().StringVar(&setDocsPermissions, "docs-permissions", "", "Docs permission policy")
5054
return cmd
5155
}
5256

@@ -82,26 +86,32 @@ func runConfigSet(cmd *cobra.Command, args []string) error {
8286
existing = &config.Config{}
8387
}
8488

85-
if cmd.Flags().Changed("client-id") {
86-
existing.ClientID = setClientID
89+
if cmd.Flags().Changed("inbox-app-id") {
90+
existing.InboxAppID = setInboxAppID
8791
}
88-
if cmd.Flags().Changed("client-secret") {
89-
existing.ClientSecret = setClientSecret
92+
if cmd.Flags().Changed("inbox-app-secret") {
93+
existing.InboxAppSecret = setInboxAppSecret
9094
}
91-
if cmd.Flags().Changed("default-mailbox") {
92-
existing.DefaultMailbox = setDefaultMailbox
95+
if cmd.Flags().Changed("inbox-default-mailbox") {
96+
existing.InboxDefaultMailbox = setInboxMailbox
9397
}
9498
if cmd.Flags().Changed("format") {
9599
existing.Format = setFormat
96100
}
97-
if cmd.Flags().Changed("pii-mode") {
98-
if !pii.IsValidMode(setPIIMode) {
99-
return fmt.Errorf("invalid --pii-mode: %q (expected off|customers|all)", setPIIMode)
101+
if cmd.Flags().Changed("inbox-pii-mode") {
102+
if !pii.IsValidMode(setInboxPIIMode) {
103+
return fmt.Errorf("invalid --inbox-pii-mode: %q (expected off|customers|all)", setInboxPIIMode)
100104
}
101-
existing.PIIMode = setPIIMode
105+
existing.InboxPIIMode = setInboxPIIMode
102106
}
103-
if cmd.Flags().Changed("pii-allow-unredacted") {
104-
existing.PIIAllowUnredacted = setPIIAllowRaw
107+
if cmd.Flags().Changed("inbox-pii-allow-unredacted") {
108+
existing.InboxPIIAllowUnredacted = setInboxPIIAllow
109+
}
110+
if cmd.Flags().Changed("docs-api-key") {
111+
existing.DocsAPIKey = setDocsAPIKey
112+
}
113+
if cmd.Flags().Changed("docs-permissions") {
114+
existing.DocsPermissions = setDocsPermissions
105115
}
106116

107117
if err := config.Save(path, existing); err != nil {
@@ -122,28 +132,34 @@ func runConfigGet(cmd *cobra.Command, args []string) error {
122132
out := cmd.OutOrStdout()
123133

124134
if len(args) == 0 {
125-
fmt.Fprintf(out, "client-id: %s\n", c.ClientID)
126-
fmt.Fprintf(out, "client-secret: %s\n", c.ClientSecret)
127-
fmt.Fprintf(out, "default-mailbox: %d\n", c.DefaultMailbox)
135+
fmt.Fprintf(out, "inbox-app-id: %s\n", c.InboxAppID)
136+
fmt.Fprintf(out, "inbox-app-secret: %s\n", c.InboxAppSecret)
137+
fmt.Fprintf(out, "inbox-default-mailbox: %d\n", c.InboxDefaultMailbox)
128138
fmt.Fprintf(out, "format: %s\n", c.Format)
129-
fmt.Fprintf(out, "pii-mode: %s\n", c.PIIMode)
130-
fmt.Fprintf(out, "pii-allow-unredacted: %t\n", c.PIIAllowUnredacted)
139+
fmt.Fprintf(out, "inbox-pii-mode: %s\n", c.InboxPIIMode)
140+
fmt.Fprintf(out, "inbox-pii-allow-unredacted: %t\n", c.InboxPIIAllowUnredacted)
141+
fmt.Fprintf(out, "docs-api-key: %s\n", c.DocsAPIKey)
142+
fmt.Fprintf(out, "docs-permissions: %s\n", c.DocsPermissions)
131143
return nil
132144
}
133145

134146
switch args[0] {
135-
case "client-id":
136-
fmt.Fprintf(out, "%s\n", c.ClientID)
137-
case "client-secret":
138-
fmt.Fprintf(out, "%s\n", c.ClientSecret)
139-
case "default-mailbox":
140-
fmt.Fprintf(out, "%d\n", c.DefaultMailbox)
147+
case "inbox-app-id":
148+
fmt.Fprintf(out, "%s\n", c.InboxAppID)
149+
case "inbox-app-secret":
150+
fmt.Fprintf(out, "%s\n", c.InboxAppSecret)
151+
case "inbox-default-mailbox":
152+
fmt.Fprintf(out, "%d\n", c.InboxDefaultMailbox)
141153
case "format":
142154
fmt.Fprintf(out, "%s\n", c.Format)
143-
case "pii-mode":
144-
fmt.Fprintf(out, "%s\n", c.PIIMode)
145-
case "pii-allow-unredacted":
146-
fmt.Fprintf(out, "%t\n", c.PIIAllowUnredacted)
155+
case "inbox-pii-mode":
156+
fmt.Fprintf(out, "%s\n", c.InboxPIIMode)
157+
case "inbox-pii-allow-unredacted":
158+
fmt.Fprintf(out, "%t\n", c.InboxPIIAllowUnredacted)
159+
case "docs-api-key":
160+
fmt.Fprintf(out, "%s\n", c.DocsAPIKey)
161+
case "docs-permissions":
162+
fmt.Fprintf(out, "%s\n", c.DocsPermissions)
147163
default:
148164
return fmt.Errorf("unknown config key: %s", args[0])
149165
}

0 commit comments

Comments
 (0)