diff --git a/onepassword/cli/op.go b/onepassword/cli/op.go index 5983d67c..4ea50815 100644 --- a/onepassword/cli/op.go +++ b/onepassword/cli/op.go @@ -100,12 +100,9 @@ func (op *OP) create(ctx context.Context, item *onepassword.Item, vaultUuid stri args := []opArg{p("item"), p("create"), p("-")} // 'op item create' command doesn't support generating passwords when using templates // therefore need to use --generate-password flag to set it - if pf := passwordField(item); pf != nil { - recipeStr := "letters,digits,32" - if pf.Recipe != nil { - recipeStr = passwordRecipeToString(pf.Recipe) - } - args = append(args, f("generate-password", recipeStr)) + recipe := passwordRecipe(item) + if recipe != "" { + args = append(args, f("generate-password", recipe)) } err = op.execJson(ctx, &res, payload, args...) diff --git a/onepassword/cli/utils.go b/onepassword/cli/utils.go index 46aee594..9c4afb55 100644 --- a/onepassword/cli/utils.go +++ b/onepassword/cli/utils.go @@ -60,6 +60,13 @@ func passwordField(item *onepassword.Item) *onepassword.ItemField { return nil } +func passwordRecipe(item *onepassword.Item) string { + if pf := passwordField(item); pf != nil { + return passwordRecipeToString(pf.Recipe) + } + return "" +} + func passwordRecipeToString(recipe *onepassword.GeneratorRecipe) string { str := "" if recipe != nil { diff --git a/onepassword/cli/utils_test.go b/onepassword/cli/utils_test.go index 7a1c18b8..ac47f544 100644 --- a/onepassword/cli/utils_test.go +++ b/onepassword/cli/utils_test.go @@ -50,6 +50,55 @@ func TestPasswordField(t *testing.T) { } } +func TestPasswordRecipeExtraction(t *testing.T) { + tests := map[string]struct { + item *onepassword.Item + expectedString string + }{ + "should return empty string if item has no fields": { + item: &onepassword.Item{}, + expectedString: "", + }, + "should return empty string if no password field": { + item: &onepassword.Item{ + Fields: []*onepassword.ItemField{ + {Purpose: onepassword.FieldPurposeNotes}, + }, + }, + expectedString: "", + }, + "should return empty string if no password recipe": { + item: &onepassword.Item{ + Fields: []*onepassword.ItemField{ + {ID: "username", Purpose: onepassword.FieldPurposeUsername}, + {ID: "password", Purpose: onepassword.FieldPurposePassword}, + }, + }, + expectedString: "", + }, + "should return recipe string": { + item: &onepassword.Item{ + Fields: []*onepassword.ItemField{ + {ID: "username", Purpose: onepassword.FieldPurposeUsername}, + {ID: "password", Purpose: onepassword.FieldPurposePassword, Recipe: &onepassword.GeneratorRecipe{ + Length: 30, + }}, + }, + }, + expectedString: "30", + }, + } + + for description, test := range tests { + t.Run(description, func(t *testing.T) { + actualString := passwordRecipe(test.item) + if actualString != test.expectedString { + t.Errorf("Unexpected password recipe string. Expected \"%s\", but got \"%s\"", test.expectedString, actualString) + } + }) + } +} + func TestPasswordRecipeToString(t *testing.T) { tests := map[string]struct { recipe *onepassword.GeneratorRecipe