package cmd import ( "fmt" "runtime" "strings" "testing" "github.com/mikefarah/yq/v3/test" ) func TestPrefixCmd(t *testing.T) { content := `b: c: 3 ` filename := test.WriteTempYamlFile(content) defer test.RemoveTempYamlFile(filename) cmd := getRootCommand() result := test.RunCmd(cmd, fmt.Sprintf("prefix %s d", filename)) if result.Error != nil { t.Error(result.Error) } expectedOutput := `d: b: c: 3 ` test.AssertResult(t, expectedOutput, result.Output) } func TestPrefixCmdArray(t *testing.T) { content := `b: c: 3 ` filename := test.WriteTempYamlFile(content) defer test.RemoveTempYamlFile(filename) cmd := getRootCommand() result := test.RunCmd(cmd, fmt.Sprintf("prefix %s [+].d.[+]", filename)) if result.Error != nil { t.Error(result.Error) } expectedOutput := `- d: - b: c: 3 ` test.AssertResult(t, expectedOutput, result.Output) } func TestPrefixCmd_MultiLayer(t *testing.T) { content := `b: c: 3 ` filename := test.WriteTempYamlFile(content) defer test.RemoveTempYamlFile(filename) cmd := getRootCommand() result := test.RunCmd(cmd, fmt.Sprintf("prefix %s d.e.f", filename)) if result.Error != nil { t.Error(result.Error) } expectedOutput := `d: e: f: b: c: 3 ` test.AssertResult(t, expectedOutput, result.Output) } func TestPrefixMultiCmd(t *testing.T) { content := `b: c: 3 --- apples: great ` filename := test.WriteTempYamlFile(content) defer test.RemoveTempYamlFile(filename) cmd := getRootCommand() result := test.RunCmd(cmd, fmt.Sprintf("prefix %s -d 1 d", filename)) if result.Error != nil { t.Error(result.Error) } expectedOutput := `b: c: 3 --- d: apples: great ` test.AssertResult(t, expectedOutput, result.Output) } func TestPrefixInvalidDocumentIndexCmd(t *testing.T) { content := `b: c: 3 ` filename := test.WriteTempYamlFile(content) defer test.RemoveTempYamlFile(filename) cmd := getRootCommand() result := test.RunCmd(cmd, fmt.Sprintf("prefix %s -df d", filename)) if result.Error == nil { t.Error("Expected command to fail due to invalid path") } expectedOutput := `Document index f is not a integer or *: strconv.ParseInt: parsing "f": invalid syntax` test.AssertResult(t, expectedOutput, result.Error.Error()) } func TestPrefixBadDocumentIndexCmd(t *testing.T) { content := `b: c: 3 ` filename := test.WriteTempYamlFile(content) defer test.RemoveTempYamlFile(filename) cmd := getRootCommand() result := test.RunCmd(cmd, fmt.Sprintf("prefix %s -d 1 d", filename)) if result.Error == nil { t.Error("Expected command to fail due to invalid path") } expectedOutput := `asked to process document index 1 but there are only 1 document(s)` test.AssertResult(t, expectedOutput, result.Error.Error()) } func TestPrefixMultiAllCmd(t *testing.T) { content := `b: c: 3 --- apples: great ` filename := test.WriteTempYamlFile(content) defer test.RemoveTempYamlFile(filename) cmd := getRootCommand() result := test.RunCmd(cmd, fmt.Sprintf("prefix %s -d * d", filename)) if result.Error != nil { t.Error(result.Error) } expectedOutput := `d: b: c: 3 --- d: apples: great` test.AssertResult(t, expectedOutput, strings.Trim(result.Output, "\n ")) } func TestPrefixCmd_Error(t *testing.T) { cmd := getRootCommand() result := test.RunCmd(cmd, "prefix") if result.Error == nil { t.Error("Expected command to fail due to missing arg") } expectedOutput := `Must provide ` test.AssertResult(t, expectedOutput, result.Error.Error()) } func TestPrefixCmd_ErrorUnreadableFile(t *testing.T) { cmd := getRootCommand() result := test.RunCmd(cmd, "prefix fake-unknown a.b") if result.Error == nil { t.Error("Expected command to fail due to unknown file") } var expectedOutput string if runtime.GOOS == "windows" { expectedOutput = `open fake-unknown: The system cannot find the file specified.` } else { expectedOutput = `open fake-unknown: no such file or directory` } test.AssertResult(t, expectedOutput, result.Error.Error()) } func TestPrefixCmd_Inplace(t *testing.T) { content := `b: c: 3 ` filename := test.WriteTempYamlFile(content) defer test.RemoveTempYamlFile(filename) cmd := getRootCommand() result := test.RunCmd(cmd, fmt.Sprintf("prefix -i %s d", filename)) if result.Error != nil { t.Error(result.Error) } gotOutput := test.ReadTempYamlFile(filename) expectedOutput := `d: b: c: 3` test.AssertResult(t, expectedOutput, strings.Trim(gotOutput, "\n ")) }