diff --git a/TODO b/TODO
index 79aa09e..e845e66 100755
--- a/TODO
+++ b/TODO
@@ -14,7 +14,7 @@ FTS
main test -
- create,
- - header
+ x header
- text box
- submit
- submit target
diff --git a/main_test.go b/main_test.go
new file mode 100644
index 0000000..83f6b72
--- /dev/null
+++ b/main_test.go
@@ -0,0 +1,171 @@
+package main
+
+import (
+ "fmt"
+ "io/ioutil"
+ "local/notes-server/config"
+ "local/notes-server/server"
+ "log"
+ "net/http"
+ "net/http/httptest"
+ "os"
+ "path"
+ "regexp"
+ "strings"
+ "testing"
+)
+
+func TestAll(t *testing.T) {
+ makeFiles(t)
+ defer os.RemoveAll(config.Root)
+ s := makeServer(t)
+ defer s.Close()
+ testServer(t, s.URL)
+}
+
+func makeFiles(t *testing.T) {
+ d, err := ioutil.TempDir(os.TempDir(), "pattern*")
+ if err != nil {
+ t.Fatal(err)
+ }
+ config.Root = d
+ for _, dir := range []string{"dirA", "dirB"} {
+ if err := os.MkdirAll(path.Join(d, dir), os.ModePerm); err != nil {
+ t.Fatal(err)
+ }
+ for _, file := range []string{"fileA", "fileB"} {
+ content := fmt.Sprintf("hello from %s/%s/%s", d, dir, file)
+ err := ioutil.WriteFile(
+ path.Join(d, dir, file),
+ []byte(content),
+ os.ModePerm,
+ )
+ if err != nil {
+ t.Fatal(err)
+ }
+ }
+ }
+}
+
+func makeServer(t *testing.T) *httptest.Server {
+ s := server.New()
+ if err := s.Routes(); err != nil {
+ t.Fatal(err)
+ }
+ return httptest.NewServer(s)
+}
+
+func testServer(t *testing.T, url string) {
+ testCreate(t, url)
+ testEdit(t, url)
+ testDir(t, url)
+ testFile(t, url)
+ testNavRootDir(t, url)
+ testNavRootFile(t, url)
+ testNavDirDir(t, url)
+ testNavDirFile(t, url)
+}
+
+func testCreate(t *testing.T, url string) {
+ for _, path := range []string{"dirX/fileX", "fileX"} {
+ resp, err := http.Get(url + "/create/" + path)
+ if err != nil {
+ t.Fatal(err)
+ }
+ defer resp.Body.Close()
+ if resp.StatusCode != http.StatusOK {
+ t.Fatal(resp.StatusCode)
+ }
+ b, _ := ioutil.ReadAll(resp.Body)
+ s := string(b)
+ log.Println(string(s))
+ if ok := assertHasMultilink(s, path); !ok {
+ t.Error(err)
+ }
+ if ok := assertHasForm(s, "/submit/"+path); !ok {
+ t.Error(err)
+ }
+ if ok := assertHasTextArea(s); !ok {
+ t.Error(err)
+ }
+ if ok := assertHasSubmit(s); !ok {
+ t.Error(err)
+ }
+ }
+}
+
+func testEdit(t *testing.T, url string) {
+ for _, path := range []string{"dirX/fileX", "fileX"} {
+ resp, err := http.Get(url + "/edit/" + path)
+ if err != nil {
+ t.Fatal(err)
+ }
+ defer resp.Body.Close()
+ if resp.StatusCode != http.StatusOK {
+ t.Fatal(resp.StatusCode)
+ }
+ b, _ := ioutil.ReadAll(resp.Body)
+ s := string(b)
+ if ok := assertHasMultilink(s, path); !ok {
+ t.Error(err)
+ }
+ if ok := assertHasForm(s); !ok {
+ t.Error(err)
+ }
+ if ok := assertHasTextArea(s); !ok {
+ t.Error(err)
+ }
+ if ok := assertHasSubmit(s); !ok {
+ t.Error(err)
+ }
+ }
+}
+
+func testDir(t *testing.T, url string) {
+ t.Error("not impl")
+}
+
+func testFile(t *testing.T, url string) {
+ t.Error("not impl")
+}
+
+func testNavRootDir(t *testing.T, url string) {
+ t.Error("not impl")
+}
+
+func testNavRootFile(t *testing.T, url string) {
+ t.Error("not impl")
+}
+
+func testNavDirDir(t *testing.T, url string) {
+ t.Error("not impl")
+}
+
+func testNavDirFile(t *testing.T, url string) {
+ t.Error("not impl")
+}
+
+func assertHasMultilink(body string, segments ...string) bool {
+ if !strings.Contains(body, `/notes/`) {
+ return false
+ }
+ for _, segment := range segments {
+ regexp := regexp.MustCompile(``)
+ if !regexp.MatchString(body) {
+ return false
+ }
+ }
+ return true
+}
+
+func assertHasForm(body string, action ...string) bool {
+ return strings.Contains(body, `