Initial commit
diff --git a/dockerimg/dockerimg_test.go b/dockerimg/dockerimg_test.go
new file mode 100644
index 0000000..cef5173
--- /dev/null
+++ b/dockerimg/dockerimg_test.go
@@ -0,0 +1,193 @@
+package dockerimg
+
+import (
+	"context"
+	"flag"
+	"io/fs"
+	"net/http"
+	"os"
+	"strings"
+	"testing"
+	"testing/fstest"
+
+	"github.com/google/go-cmp/cmp"
+	"sketch.dev/httprr"
+)
+
+var flagRewriteWant = flag.Bool("rewritewant", false, "rewrite the dockerfiles we want from the model")
+
+func TestCreateDockerfile(t *testing.T) {
+	ctx := context.Background()
+
+	tests := []struct {
+		name string
+		fsys fs.FS
+	}{
+		{
+			name: "Basic repo with README",
+			fsys: fstest.MapFS{
+				"README.md": &fstest.MapFile{Data: []byte("# Test Project\nA Go project for testing.")},
+			},
+		},
+		{
+			// TODO: this looks bogus.
+			name: "Repo with README and workflow",
+			fsys: fstest.MapFS{
+				"README.md": &fstest.MapFile{Data: []byte("# Test Project\nA Go project for testing.")},
+				".github/workflows/test.yml": &fstest.MapFile{Data: []byte(`name: Test
+on: [push]
+jobs:
+  test:
+    runs-on: ubuntu-latest
+    steps:
+      - uses: actions/checkout@v2
+      - uses: actions/setup-node@v3
+        with:
+          node-version: '18'
+      - name: Install and activate corepack
+        run: |
+          npm install -g corepack
+          corepack enable
+      - run: go test ./...`)},
+			},
+		},
+		{
+			name: "mention a devtool in the readme",
+			fsys: fstest.MapFS{
+				"readme.md": &fstest.MapFile{Data: []byte("# Test Project\nYou must install `dot` to run the tests.")},
+			},
+		},
+		{
+			name: "empty repo",
+			fsys: fstest.MapFS{
+				"main.go": &fstest.MapFile{Data: []byte("package main\n\nfunc main() {}")},
+			},
+		},
+		{
+			name: "python misery",
+			fsys: fstest.MapFS{
+				"README.md": &fstest.MapFile{Data: []byte("# Our amazing repo\n\nTo use this project you need python 3.11 and the dvc tool")},
+			},
+		},
+	}
+
+	for _, tt := range tests {
+		t.Run(tt.name, func(t *testing.T) {
+			basePath := "testdata/" + strings.ToLower(strings.Replace(t.Name(), "/", "_", -1))
+			rrPath := basePath + ".httprr"
+			rr, err := httprr.Open(rrPath, http.DefaultTransport)
+			if err != nil && !os.IsNotExist(err) {
+				t.Fatal(err)
+			}
+			rr.ScrubReq(func(req *http.Request) error {
+				req.Header.Del("x-api-key")
+				return nil
+			})
+			initFiles, err := readInitFiles(tt.fsys)
+			if err != nil {
+				t.Fatal(err)
+			}
+			result, err := createDockerfile(ctx, rr.Client(), "", os.Getenv("ANTHROPIC_API_KEY"), initFiles, "")
+			if err != nil {
+				t.Fatal(err)
+			}
+
+			wantPath := basePath + ".dockerfile"
+
+			if *flagRewriteWant {
+				if err := os.WriteFile(wantPath, []byte(result), 0o666); err != nil {
+					t.Fatal(err)
+				}
+				return
+			}
+
+			wantBytes, err := os.ReadFile(wantPath)
+			if err != nil {
+				t.Fatal(err)
+			}
+			want := string(wantBytes)
+			if diff := cmp.Diff(want, result); diff != "" {
+				t.Errorf("dockerfile does not match. got:\n----\n%s\n----\n\ndiff: %s", result, diff)
+			}
+		})
+	}
+}
+
+func TestReadInitFiles(t *testing.T) {
+	testFS := fstest.MapFS{
+		"README.md":                  &fstest.MapFile{Data: []byte("# Test Repo")},
+		".github/workflows/test.yml": &fstest.MapFile{Data: []byte("name: Test Workflow")},
+		"main.go":                    &fstest.MapFile{Data: []byte("package main")},
+		".git/HEAD":                  &fstest.MapFile{Data: []byte("ref: refs/heads/main")},
+		"random/README.md":           &fstest.MapFile{Data: []byte("ignore me")},
+	}
+
+	files, err := readInitFiles(testFS)
+	if err != nil {
+		t.Fatalf("readInitFiles failed: %v", err)
+	}
+
+	// Should have 2 files: README.md and .github/workflows/test.yml
+	if len(files) != 2 {
+		t.Errorf("Expected 2 files, got %d", len(files))
+	}
+
+	if content, ok := files["README.md"]; !ok {
+		t.Error("README.md not found")
+	} else if content != "# Test Repo" {
+		t.Errorf("README.md has incorrect content: %q", content)
+	}
+
+	if content, ok := files[".github/workflows/test.yml"]; !ok {
+		t.Error(".github/workflows/test.yml not found")
+	} else if content != "name: Test Workflow" {
+		t.Errorf("Workflow file has incorrect content: %q", content)
+	}
+
+	if _, ok := files["main.go"]; ok {
+		t.Error("main.go should not be included")
+	}
+
+	if _, ok := files[".git/HEAD"]; ok {
+		t.Error(".git/HEAD should not be included")
+	}
+}
+
+func TestReadInitFilesWithSubdir(t *testing.T) {
+	// Create a file system with files in a subdirectory
+	testFS := fstest.MapFS{
+		"subdir/README.md":                  &fstest.MapFile{Data: []byte("# Test Repo")},
+		"subdir/.github/workflows/test.yml": &fstest.MapFile{Data: []byte("name: Test Workflow")},
+		"subdir/main.go":                    &fstest.MapFile{Data: []byte("package main")},
+	}
+
+	// Use fs.Sub to get a sub-filesystem
+	subFS, err := fs.Sub(testFS, "subdir")
+	if err != nil {
+		t.Fatalf("fs.Sub failed: %v", err)
+	}
+
+	files, err := readInitFiles(subFS)
+	if err != nil {
+		t.Fatalf("readInitFiles failed: %v", err)
+	}
+
+	// Should have 2 files: README.md and .github/workflows/test.yml
+	if len(files) != 2 {
+		t.Errorf("Expected 2 files, got %d", len(files))
+	}
+
+	// Verify README.md was found
+	if content, ok := files["README.md"]; !ok {
+		t.Error("README.md not found")
+	} else if content != "# Test Repo" {
+		t.Errorf("README.md has incorrect content: %q", content)
+	}
+
+	// Verify workflow file was found
+	if content, ok := files[".github/workflows/test.yml"]; !ok {
+		t.Error(".github/workflows/test.yml not found")
+	} else if content != "name: Test Workflow" {
+		t.Errorf("Workflow file has incorrect content: %q", content)
+	}
+}