Skip to content

Commit

Permalink
Add support for deleting post
Browse files Browse the repository at this point in the history
Closes #12
  • Loading branch information
minodisk committed Feb 4, 2016
1 parent 0265d6f commit e74c784
Show file tree
Hide file tree
Showing 5 changed files with 231 additions and 11 deletions.
7 changes: 6 additions & 1 deletion cli/app.go
Original file line number Diff line number Diff line change
Expand Up @@ -155,7 +155,12 @@ func GenerateApp(client api.Client, outWriter io.Writer, errWriter io.Writer) (a
Name: "post",
Usage: "Delete a post",
Action: partialize(command.DeletePost, client, errWriter),
Flags: []cli.Flag{},
Flags: []cli.Flag{
cli.StringFlag{
Name: "filename, f",
Usage: "The filename of the post to be updated",
},
},
},
},
},
Expand Down
11 changes: 11 additions & 0 deletions command/post.go
Original file line number Diff line number Diff line change
Expand Up @@ -166,6 +166,17 @@ func UpdatePost(c *cli.Context, client api.Client) (err error) {
}

func DeletePost(c *cli.Context, client api.Client) (err error) {
filename := c.String("filename")

post, err := model.NewPostWithFile(filename)
if err != nil {
return
}
err = post.Delete(client)
if err != nil {
return
}
err = post.Save()
return
}

Expand Down
97 changes: 97 additions & 0 deletions command/post_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -208,6 +208,39 @@ func TestMain(m *testing.M) {
return
}

case "DELETE":
defer r.Body.Close()

b, err := ioutil.ReadAll(r.Body)
if err != nil {
testutil.ResponseError(w, 500, err)
return
}
if string(b) == "" {
testutil.ResponseAPIError(w, 500, api.ResponseError{
Type: "fatal",
Message: "empty body",
})
return
}

var post model.Post
err = json.Unmarshal(b, &post)
if err != nil {
testutil.ResponseError(w, 500, err)
return
}
b, err = json.Marshal(post)
if err != nil {
testutil.ResponseError(w, 500, err)
return
}
_, err = w.Write(b)
if err != nil {
testutil.ResponseError(w, 500, err)
return
}

default:
w.WriteHeader(405)
}
Expand Down Expand Up @@ -673,6 +706,70 @@ tags:
}
}

func TestDeletePost(t *testing.T) {
testutil.CleanUp()
defer testutil.CleanUp()

err := os.MkdirAll("mine/2000/01", 0755)
if err != nil {
t.Fatal(err)
}
err = ioutil.WriteFile("mine/2000/01/01-example-title.md", []byte(`<!--
id: 4bd431809afb1bb99e4f
url: https://qiita.com/yaotti/items/4bd431809afb1bb99e4f
created_at: 2000-01-01T09:00:00+09:00
updated_at: 2000-01-01T09:00:00+09:00
private: false
coediting: false
tags:
- Ruby:
- 0.0.1
- NewTag:
- "1.0"
-->
# Example edited title
## Example edited body`), 0664)
if err != nil {
t.Fatal(err)
}

errBuf := bytes.NewBuffer([]byte{})
app := cli.GenerateApp(client, os.Stdout, errBuf)
err = app.Run([]string{"qiitactl", "delete", "post", "-f", "mine/2000/01/01-example-title.md"})
if err != nil {
t.Fatal(err)
}
e := errBuf.Bytes()
if len(e) != 0 {
t.Fatal(string(e))
}

b, err := ioutil.ReadFile("mine/2000/01/01-example-title.md")
if err != nil {
t.Fatal(err)
}

actual := string(b)
expected := `<!--
id: 4bd431809afb1bb99e4f
url: https://qiita.com/yaotti/items/4bd431809afb1bb99e4f
created_at: 2000-01-01T09:00:00+09:00
updated_at: 2000-01-01T09:00:00+09:00
private: false
coediting: false
tags:
- Ruby:
- 0.0.1
- NewTag:
- "1.0"
-->
# Example edited title
## Example edited body`
if actual != expected {
t.Errorf("wrong content:\n%s", testutil.Diff(expected, actual))
}
}

// func TestTracingPostFileWithPostID(t *testing.T) {
// defer cleanUp()
//
Expand Down
33 changes: 25 additions & 8 deletions model/post.go
Original file line number Diff line number Diff line change
Expand Up @@ -103,13 +103,6 @@ func FetchPost(client api.Client, team *Team, id string) (post Post, err error)
return
}

type EmptyIDError struct{}

func (err EmptyIDError) Error() (msg string) {
msg = "post: ID is empty"
return
}

func (post *Post) Update(client api.Client) (err error) {
if post.ID == "" {
err = EmptyIDError{}
Expand All @@ -131,7 +124,24 @@ func (post *Post) Update(client api.Client) (err error) {
return
}

func (post Post) Delete(client api.Client) (err error) {
func (post *Post) Delete(client api.Client) (err error) {
if post.ID == "" {
err = EmptyIDError{}
return
}

subDomain := ""
if post.Team != nil {
subDomain = post.Team.ID
}
body, err := client.Delete(subDomain, fmt.Sprintf("/items/%s", post.ID), post)
if err != nil {
return
}
err = json.Unmarshal(body, post)
if err != nil {
return
}
return
}

Expand Down Expand Up @@ -252,3 +262,10 @@ func (post *Post) Decode(b []byte) (err error) {
post.Body = string(bytes.TrimSpace(matched[3]))
return
}

type EmptyIDError struct{}

func (err EmptyIDError) Error() (msg string) {
msg = "post: ID is empty"
return
}
94 changes: 92 additions & 2 deletions model/post_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -346,8 +346,9 @@ func TestPostUpdateWithEmptyID(t *testing.T) {

post := model.NewPost("Example Title", &model.Time{time.Date(2000, 1, 1, 9, 0, 0, 0, time.UTC)}, nil)
err = post.Update(client)
if err == nil {
t.Fatal("error should occur")
err, ok := err.(model.EmptyIDError)
if !ok {
t.Fatal("empty ID error should occur")
}
}

Expand Down Expand Up @@ -428,6 +429,95 @@ func TestPostUpdate(t *testing.T) {
}
}

func TestPostDeleteWithEmptyID(t *testing.T) {
testutil.CleanUp()
defer testutil.CleanUp()

client, err := api.NewClient(nil)
if err != nil {
t.Fatal(err)
}

post := model.NewPost("Example Title", &model.Time{time.Date(2000, 1, 1, 9, 0, 0, 0, time.UTC)}, nil)
err = post.Delete(client)
err, ok := err.(model.EmptyIDError)
if !ok {
t.Fatal("empty ID error should occur")
}
}

func TestPostDelete(t *testing.T) {
testutil.CleanUp()
defer testutil.CleanUp()

mux := http.NewServeMux()
mux.HandleFunc("/api/v2/items/abcdefghijklmnopqrst", func(w http.ResponseWriter, r *http.Request) {
if r.Method != "DELETE" {
w.WriteHeader(405)
b, _ := json.Marshal(api.ResponseError{"method_not_allowed", "Method Not Allowed"})
w.Write(b)
return
}

defer r.Body.Close()

b, err := ioutil.ReadAll(r.Body)
if err != nil {
testutil.ResponseError(w, 500, err)
return
}
if string(b) == "" {
testutil.ResponseAPIError(w, 500, api.ResponseError{
Type: "fatal",
Message: "empty body",
})
return
}

var post model.Post
err = json.Unmarshal(b, &post)
if err != nil {
testutil.ResponseError(w, 500, err)
return
}

b, err = json.Marshal(post)
if err != nil {
testutil.ResponseError(w, 500, err)
return
}

_, err = w.Write(b)
if err != nil {
testutil.ResponseError(w, 500, err)
return
}
})

server := httptest.NewServer(mux)
defer server.Close()

err := os.Setenv("QIITA_ACCESS_TOKEN", "XXXXXXXXXXXX")
if err != nil {
t.Fatal(err)
}

client, err := api.NewClient(func(subDomain, path string) (url string) {
url = fmt.Sprintf("%s%s%s", server.URL, "/api/v2", path)
return
})
if err != nil {
t.Fatal(err)
}

post := model.NewPost("Example Title", &model.Time{time.Date(2000, 1, 1, 9, 0, 0, 0, time.UTC)}, nil)
post.ID = "abcdefghijklmnopqrst"
err = post.Delete(client)
if err != nil {
t.Fatal(err)
}
}

func TestPostSave(t *testing.T) {
testutil.CleanUp()
defer testutil.CleanUp()
Expand Down

0 comments on commit e74c784

Please sign in to comment.