diff options
| author | Ed Zynda <[email protected]> | 2025-05-23 14:54:09 +0300 |
|---|---|---|
| committer | GitHub <[email protected]> | 2025-05-23 06:54:09 -0500 |
| commit | 89e3a72ae10b96cc1d8a01a8882c6d9e81f20b6a (patch) | |
| tree | 1057cf90f0c55556de740fdb6798464e88732839 /cmd/root_test.go | |
| parent | b9ebcea82c262dc834633c2c8f44a94fe8773a15 (diff) | |
| download | opencode-89e3a72ae10b96cc1d8a01a8882c6d9e81f20b6a.tar.gz opencode-89e3a72ae10b96cc1d8a01a8882c6d9e81f20b6a.zip | |
feat: add support for piped input to CLI (#51)
Diffstat (limited to 'cmd/root_test.go')
| -rw-r--r-- | cmd/root_test.go | 143 |
1 files changed, 143 insertions, 0 deletions
diff --git a/cmd/root_test.go b/cmd/root_test.go new file mode 100644 index 000000000..284ef5837 --- /dev/null +++ b/cmd/root_test.go @@ -0,0 +1,143 @@ +package cmd + +import ( + "bytes" + "io" + "os" + "testing" +) + +func TestCheckStdinPipe(t *testing.T) { + // Save original stdin + origStdin := os.Stdin + + // Restore original stdin when test completes + defer func() { + os.Stdin = origStdin + }() + + // Test case 1: Data is piped in + t.Run("WithPipedData", func(t *testing.T) { + // Create a pipe + r, w, err := os.Pipe() + if err != nil { + t.Fatalf("Failed to create pipe: %v", err) + } + + // Replace stdin with our pipe + os.Stdin = r + + // Write test data to the pipe + testData := "test piped input" + go func() { + defer w.Close() + w.Write([]byte(testData)) + }() + + // Call the function + data, hasPiped := checkStdinPipe() + + // Check results + if !hasPiped { + t.Error("Expected hasPiped to be true, got false") + } + if data != testData { + t.Errorf("Expected data to be %q, got %q", testData, data) + } + }) + + // Test case 2: No data is piped in (simulated terminal) + t.Run("WithoutPipedData", func(t *testing.T) { + // Create a temporary file to simulate a terminal + tmpFile, err := os.CreateTemp("", "terminal-sim") + if err != nil { + t.Fatalf("Failed to create temp file: %v", err) + } + defer os.Remove(tmpFile.Name()) + defer tmpFile.Close() + + // Open the file for reading + f, err := os.Open(tmpFile.Name()) + if err != nil { + t.Fatalf("Failed to open temp file: %v", err) + } + defer f.Close() + + // Replace stdin with our file + os.Stdin = f + + // Call the function + data, hasPiped := checkStdinPipe() + + // Check results + if hasPiped { + t.Error("Expected hasPiped to be false, got true") + } + if data != "" { + t.Errorf("Expected data to be empty, got %q", data) + } + }) +} + +// This is a mock implementation for testing since we can't easily mock os.Stdin.Stat() +// in a way that would return the correct Mode() for our test cases +func mockCheckStdinPipe(reader io.Reader, isPipe bool) (string, bool) { + if !isPipe { + return "", false + } + + data, err := io.ReadAll(reader) + if err != nil { + return "", false + } + + if len(data) > 0 { + return string(data), true + } + return "", false +} + +func TestMockCheckStdinPipe(t *testing.T) { + // Test with data + t.Run("WithData", func(t *testing.T) { + testData := "test data" + reader := bytes.NewBufferString(testData) + + data, hasPiped := mockCheckStdinPipe(reader, true) + + if !hasPiped { + t.Error("Expected hasPiped to be true, got false") + } + if data != testData { + t.Errorf("Expected data to be %q, got %q", testData, data) + } + }) + + // Test without data + t.Run("WithoutData", func(t *testing.T) { + reader := bytes.NewBufferString("") + + data, hasPiped := mockCheckStdinPipe(reader, true) + + if hasPiped { + t.Error("Expected hasPiped to be false, got true") + } + if data != "" { + t.Errorf("Expected data to be empty, got %q", data) + } + }) + + // Test not a pipe + t.Run("NotAPipe", func(t *testing.T) { + reader := bytes.NewBufferString("data that should be ignored") + + data, hasPiped := mockCheckStdinPipe(reader, false) + + if hasPiped { + t.Error("Expected hasPiped to be false, got true") + } + if data != "" { + t.Errorf("Expected data to be empty, got %q", data) + } + }) +}
\ No newline at end of file |
