package infra import ( "os" "path/filepath" "strings" "testing" ) func TestWriteDockerfile(t *testing.T) { t.Run("escribe Dockerfile en directorio existente", func(t *testing.T) { tmpDir := t.TempDir() content := "FROM alpine:latest\nCMD [\"sh\"]\n" path, err := WriteDockerfile(tmpDir, content) if err != nil { t.Fatalf("unexpected error: %v", err) } data, err := os.ReadFile(path) if err != nil { t.Fatalf("cannot read written file: %v", err) } if string(data) != content { t.Errorf("content mismatch: got %q, want %q", string(data), content) } }) t.Run("crea directorio si no existe", func(t *testing.T) { tmpDir := t.TempDir() newDir := filepath.Join(tmpDir, "subdir", "nested") content := "FROM scratch\n" path, err := WriteDockerfile(newDir, content) if err != nil { t.Fatalf("unexpected error: %v", err) } if _, statErr := os.Stat(newDir); os.IsNotExist(statErr) { t.Error("expected directory to be created") } if _, statErr := os.Stat(path); os.IsNotExist(statErr) { t.Errorf("expected Dockerfile at %s", path) } }) t.Run("retorna path absoluto correcto", func(t *testing.T) { tmpDir := t.TempDir() content := "FROM ubuntu:22.04\n" path, err := WriteDockerfile(tmpDir, content) if err != nil { t.Fatalf("unexpected error: %v", err) } if !filepath.IsAbs(path) { t.Errorf("expected absolute path, got: %s", path) } if !strings.HasSuffix(path, "Dockerfile") { t.Errorf("expected path to end with Dockerfile, got: %s", path) } }) t.Run("error si dir es path invalido", func(t *testing.T) { // Intentar escribir en un path donde el padre es un archivo (no directorio) tmpDir := t.TempDir() // Crear un archivo donde esperamos un directorio blockerPath := filepath.Join(tmpDir, "blocker") if err := os.WriteFile(blockerPath, []byte("x"), 0o644); err != nil { t.Fatal(err) } // Intentar usar ese archivo como directorio _, err := WriteDockerfile(filepath.Join(blockerPath, "subdir"), "FROM scratch\n") if err == nil { t.Error("expected error when dir path goes through a file, got nil") } }) }