Merge pull request #209 from dnephin/golden-create-dir

golden: create directories when -test.update-golden
diff --git a/golden/golden.go b/golden/golden.go
index 2e01ee8..54102dd 100644
--- a/golden/golden.go
+++ b/golden/golden.go
@@ -72,13 +72,6 @@
 	return filepath.Join("testdata", filename)
 }
 
-func update(filename string, actual []byte) error {
-	if *flagUpdate {
-		return ioutil.WriteFile(Path(filename), actual, 0644)
-	}
-	return nil
-}
-
 func removeCarriageReturn(in []byte) []byte {
 	if !NormalizeCRLFToLF {
 		return in
@@ -180,3 +173,15 @@
 	}
 	return nil, expected
 }
+
+func update(filename string, actual []byte) error {
+	if dir := filepath.Dir(filename); dir != "." {
+		if err := os.MkdirAll(dir, 0755); err != nil {
+			return err
+		}
+	}
+	if *flagUpdate {
+		return ioutil.WriteFile(Path(filename), actual, 0644)
+	}
+	return nil
+}
diff --git a/golden/golden_test.go b/golden/golden_test.go
index b6ba3af..d7c88a3 100644
--- a/golden/golden_test.go
+++ b/golden/golden_test.go
@@ -211,3 +211,33 @@
 	defer undo()
 	assert.Assert(t, FlagUpdate())
 }
+
+func TestUpdate_CreatesPathsAndFile(t *testing.T) {
+	undo := setUpdateFlag()
+	defer undo()
+
+	dir := fs.NewDir(t, t.Name())
+
+	t.Run("creates the file", func(t *testing.T) {
+		filename := dir.Join("filename")
+		err := update(filename, nil)
+		assert.NilError(t, err)
+
+		_, err = os.Stat(filename)
+		assert.NilError(t, err)
+	})
+
+	t.Run("creates directories", func(t *testing.T) {
+		filename := dir.Join("one/two/filename")
+		err := update(filename, nil)
+		assert.NilError(t, err)
+
+		_, err = os.Stat(filename)
+		assert.NilError(t, err)
+
+		t.Run("no error when directory exists", func(t *testing.T) {
+			err = update(filename, nil)
+			assert.NilError(t, err)
+		})
+	})
+}