From 7a857e857f6b123416a01c3dc20a92a45af7b5ce Mon Sep 17 00:00:00 2001 From: Niko Abeler Date: Sat, 13 Aug 2022 11:26:17 +0200 Subject: [PATCH] integration of alias redirect in other handlers. #2 --- cmd/owl-web/aliases_test.go | 121 ++++++++++++++++++++++++++++++++++++ cmd/owl-web/handler.go | 18 ++---- user.go | 5 ++ 3 files changed, 132 insertions(+), 12 deletions(-) diff --git a/cmd/owl-web/aliases_test.go b/cmd/owl-web/aliases_test.go index d6e4b5f..5d94d16 100644 --- a/cmd/owl-web/aliases_test.go +++ b/cmd/owl-web/aliases_test.go @@ -76,3 +76,124 @@ func TestNoRedirectOnNonExistingAliases(t *testing.T) { } } + +func TestNoRedirectIfValidPostUrl(t *testing.T) { + repo := getTestRepo() + user, _ := repo.CreateUser("test-1") + post, _ := user.CreateNewPost("post-1") + post2, _ := user.CreateNewPost("post-2") + + content := "---\n" + content += "title: Test\n" + content += "aliases: \n" + content += " - " + post2.UrlPath() + "\n" + content += "---\n" + content += "This is a test" + os.WriteFile(post.ContentFile(), []byte(content), 0644) + + // Create Request and Response + req, err := http.NewRequest("GET", post2.UrlPath(), nil) + if err != nil { + t.Fatal(err) + } + rr := httptest.NewRecorder() + router := main.Router(&repo) + router.ServeHTTP(rr, req) + + // Check the status code is what we expect. + if status := rr.Code; status != http.StatusOK { + t.Errorf("handler returned wrong status code: got %v want %v", + status, http.StatusOK) + } + +} + +func TestRedirectIfInvalidPostUrl(t *testing.T) { + repo := getTestRepo() + user, _ := repo.CreateUser("test-1") + post, _ := user.CreateNewPost("post-1") + + content := "---\n" + content += "title: Test\n" + content += "aliases: \n" + content += " - " + user.UrlPath() + "posts/not-a-real-post/" + "\n" + content += "---\n" + content += "This is a test" + os.WriteFile(post.ContentFile(), []byte(content), 0644) + + // Create Request and Response + req, err := http.NewRequest("GET", user.UrlPath()+"posts/not-a-real-post/", nil) + if err != nil { + t.Fatal(err) + } + rr := httptest.NewRecorder() + router := main.Router(&repo) + router.ServeHTTP(rr, req) + + // Check the status code is what we expect. + if status := rr.Code; status != http.StatusMovedPermanently { + t.Errorf("handler returned wrong status code: got %v want %v", + status, http.StatusMovedPermanently) + } + +} + +func TestRedirectIfInvalidUserUrl(t *testing.T) { + repo := getTestRepo() + user, _ := repo.CreateUser("test-1") + post, _ := user.CreateNewPost("post-1") + + content := "---\n" + content += "title: Test\n" + content += "aliases: \n" + content += " - /user/not-real/ \n" + content += "---\n" + content += "This is a test" + os.WriteFile(post.ContentFile(), []byte(content), 0644) + + // Create Request and Response + req, err := http.NewRequest("GET", "/user/not-real/", nil) + if err != nil { + t.Fatal(err) + } + rr := httptest.NewRecorder() + router := main.Router(&repo) + router.ServeHTTP(rr, req) + + // Check the status code is what we expect. + if status := rr.Code; status != http.StatusMovedPermanently { + t.Errorf("handler returned wrong status code: got %v want %v", + status, http.StatusMovedPermanently) + } + +} + +func TestRedirectIfInvalidMediaUrl(t *testing.T) { + repo := getTestRepo() + user, _ := repo.CreateUser("test-1") + post, _ := user.CreateNewPost("post-1") + + content := "---\n" + content += "title: Test\n" + content += "aliases: \n" + content += " - " + post.UrlMediaPath("not-real") + "\n" + content += "---\n" + content += "This is a test" + os.WriteFile(post.ContentFile(), []byte(content), 0644) + + // Create Request and Response + req, err := http.NewRequest("GET", post.UrlMediaPath("not-real"), nil) + if err != nil { + t.Fatal(err) + } + rr := httptest.NewRecorder() + router := main.Router(&repo) + router.ServeHTTP(rr, req) + + // Check the status code is what we expect. + if status := rr.Code; status != http.StatusMovedPermanently { + t.Errorf("handler returned wrong status code: got %v want %v", + status, http.StatusMovedPermanently) + } + +} diff --git a/cmd/owl-web/handler.go b/cmd/owl-web/handler.go index 8de8ade..a446401 100644 --- a/cmd/owl-web/handler.go +++ b/cmd/owl-web/handler.go @@ -41,8 +41,7 @@ func userIndexHandler(repo *owl.Repository) func(http.ResponseWriter, *http.Requ user, err := getUserFromRepo(repo, ps) if err != nil { println("Error getting user: ", err.Error()) - w.WriteHeader(http.StatusNotFound) - w.Write([]byte("User not found")) + notFoundHandler(repo)(w, r) return } html, err := owl.RenderIndexPage(user) @@ -64,15 +63,13 @@ func postHandler(repo *owl.Repository) func(http.ResponseWriter, *http.Request, user, err := getUserFromRepo(repo, ps) if err != nil { println("Error getting user: ", err.Error()) - w.WriteHeader(http.StatusNotFound) - w.Write([]byte("User not found")) + notFoundHandler(repo)(w, r) return } post, err := user.GetPost(postId) if err != nil { println("Error getting post: ", err.Error()) - w.WriteHeader(http.StatusNotFound) - w.Write([]byte("Post not found")) + notFoundHandler(repo)(w, r) return } html, err := owl.RenderPost(post) @@ -96,22 +93,19 @@ func postMediaHandler(repo *owl.Repository) func(http.ResponseWriter, *http.Requ user, err := getUserFromRepo(repo, ps) if err != nil { println("Error getting user: ", err.Error()) - w.WriteHeader(http.StatusNotFound) - w.Write([]byte("User not found")) + notFoundHandler(repo)(w, r) return } post, err := user.GetPost(postId) if err != nil { println("Error getting post: ", err.Error()) - w.WriteHeader(http.StatusNotFound) - w.Write([]byte("Post not found")) + notFoundHandler(repo)(w, r) return } filepath = path.Join(post.MediaDir(), filepath) if _, err := os.Stat(filepath); err != nil { println("Error getting file: ", err.Error()) - w.WriteHeader(http.StatusNotFound) - w.Write([]byte("File not found")) + notFoundHandler(repo)(w, r) return } http.ServeFile(w, r, filepath) diff --git a/user.go b/user.go index 0998304..82fe15f 100644 --- a/user.go +++ b/user.go @@ -60,6 +60,11 @@ func (user User) Posts() ([]string, error) { } func (user User) GetPost(id string) (Post, error) { + // check if posts index.md exists + if !fileExists(path.Join(user.Dir(), "public", id, "index.md")) { + return Post{}, fmt.Errorf("post %s does not exist", id) + } + post := Post{user: &user, id: id} _, metaData := post.MarkdownData() title := metaData["title"]