From 6292463e900a8e2f45134f1504f9307736496ff0 Mon Sep 17 00:00:00 2001 From: vinchent Date: Tue, 24 Sep 2024 20:57:28 +0200 Subject: [PATCH] blogposts: test get blog content --- blogposts/blogposts.go | 37 ++++++++++++++++++++++++++++++++++--- blogposts/blogposts_test.go | 26 +++++++++++++++++++++++--- 2 files changed, 57 insertions(+), 6 deletions(-) diff --git a/blogposts/blogposts.go b/blogposts/blogposts.go index 2ca1c49..b97a009 100644 --- a/blogposts/blogposts.go +++ b/blogposts/blogposts.go @@ -1,12 +1,43 @@ package blogposts -import "io/fs" +import ( + "io" + "io/fs" +) type Post struct { Title, Description, Body string Tags []string } -func NewPostsFromFS(fs fs.FS) []Post { - return []Post{{}, {}} +func NewPostsFromFS(fileSystem fs.FS) ([]Post, error) { + dir, err := fs.ReadDir(fileSystem, ".") + if err != nil { + return nil, err + } + var posts []Post + for _, f := range dir { + post, err := getPost(fileSystem, f) + if err != nil { + return nil, err + } + posts = append(posts, post) + } + return posts, nil +} + +func getPost(fileSystem fs.FS, f fs.DirEntry) (Post, error) { + postFile, err := fileSystem.Open(f.Name()) + if err != nil { + return Post{}, err + } + defer postFile.Close() + + postData, err := io.ReadAll(postFile) + if err != nil { + return Post{}, err + } + + post := Post{Title: string(postData)[7:]} + return post, nil } diff --git a/blogposts/blogposts_test.go b/blogposts/blogposts_test.go index 96f3b9f..dd0e7e0 100644 --- a/blogposts/blogposts_test.go +++ b/blogposts/blogposts_test.go @@ -1,20 +1,40 @@ package blogposts import ( + "reflect" "testing" "testing/fstest" ) // NOTE: This should be a black box test outside blogposts package. +// NOTE: If we want to test the return error +// +// type StubFailingFS struct{} +// +// func (s StubFailingFS) Open(name string) (fs.File, error) { +// return nil, errors.New("fail") +// } + func TestNewBlogPosts(t *testing.T) { fs := fstest.MapFS{ - "hello world.md": {Data: []byte("hi")}, - "hello-world2.md": {Data: []byte("hola")}, + "hello world.md": {Data: []byte("Title: Post 1")}, + "hello-world2.md": {Data: []byte("Title: Post 2")}, + } + + posts, err := NewPostsFromFS(fs) + if err != nil { + t.Fatal(err) } - posts := NewPostsFromFS(fs) if len(posts) != len(fs) { t.Errorf("got %d posts, wanted %d posts", len(posts), len(fs)) } + + got := posts[0] + want := Post{Title: "Post 1"} + + if !reflect.DeepEqual(got, want) { + t.Errorf("got %+v, want %+v", got, want) + } }