From 2e419836e3706bf18c8763c29bf71618c995e93a Mon Sep 17 00:00:00 2001 From: mukai_masaki Date: Thu, 12 Jul 2018 01:55:42 +0900 Subject: [PATCH 1/3] kadai4 --- kadai4/mukai/handler/dateProvider.go | 18 ++++++++ kadai4/mukai/handler/middleWare.go | 10 +++++ kadai4/mukai/handler/omikujiHandler.go | 41 ++++++++++++++++++ kadai4/mukai/handler/omikujiHandler_test.go | 46 +++++++++++++++++++++ kadai4/mukai/main.go | 17 ++++++++ 5 files changed, 132 insertions(+) create mode 100644 kadai4/mukai/handler/dateProvider.go create mode 100644 kadai4/mukai/handler/middleWare.go create mode 100644 kadai4/mukai/handler/omikujiHandler.go create mode 100644 kadai4/mukai/handler/omikujiHandler_test.go create mode 100644 kadai4/mukai/main.go diff --git a/kadai4/mukai/handler/dateProvider.go b/kadai4/mukai/handler/dateProvider.go new file mode 100644 index 0000000..1a13708 --- /dev/null +++ b/kadai4/mukai/handler/dateProvider.go @@ -0,0 +1,18 @@ +package handler + +import "time" + +type DateProvider interface { + Now() time.Time +} +type NowTimeProvider struct { } +func (p NowTimeProvider) Now() time.Time { + return time.Now() +} + +type ArbitraryTimeProvider struct { + time time.Time +} +func (p ArbitraryTimeProvider) Now() time.Time { + return p.time +} diff --git a/kadai4/mukai/handler/middleWare.go b/kadai4/mukai/handler/middleWare.go new file mode 100644 index 0000000..546a5c5 --- /dev/null +++ b/kadai4/mukai/handler/middleWare.go @@ -0,0 +1,10 @@ +package handler + +import "net/http" + +func HeaderMiddleWare(h http.Handler) http.Handler { + return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + w.Header().Add("Content-Type", "application/json; charset=utf-8") + h.ServeHTTP(w, r) + }) +} diff --git a/kadai4/mukai/handler/omikujiHandler.go b/kadai4/mukai/handler/omikujiHandler.go new file mode 100644 index 0000000..0f858f8 --- /dev/null +++ b/kadai4/mukai/handler/omikujiHandler.go @@ -0,0 +1,41 @@ +package handler + +import ( + "net/http" + "bytes" + "encoding/json" + "fmt" + "math/rand" +) + +type OmikujiHandler struct { + DateProvider DateProvider +} +func (o OmikujiHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) { + result := result{Data: o.omikuji()} + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(result); err != nil { + fmt.Fprintln(w, "error") + } + fmt.Fprintln(w, buf.String()) +} + +func (o OmikujiHandler) omikuji() string { + now := o.DateProvider.Now() + if now.Month() == 1 && (1 <= now.Day() && now.Day() <= 3) { + return "大吉" + } + i := rand.Intn(4) + switch i { + case 0: return "大吉" + case 1: return "中吉" + case 2: return "小吉" + case 3: return "凶" + default: return "凶" + } +} + +type result struct { + Data string `json:"data"` +} + diff --git a/kadai4/mukai/handler/omikujiHandler_test.go b/kadai4/mukai/handler/omikujiHandler_test.go new file mode 100644 index 0000000..b16bfda --- /dev/null +++ b/kadai4/mukai/handler/omikujiHandler_test.go @@ -0,0 +1,46 @@ +package handler + +import ( + "net/http/httptest" + "testing" + "time" + "reflect" + "encoding/json" + "log" +) + +func TestOmikujiHandler(t *testing.T) { + type fields struct { + month time.Month + day int + } + + tests := []struct { + name string + fields fields + want string + }{ + {name:"1/1", fields:fields{month:1, day:1}, want:"大吉"}, + {name:"1/2", fields:fields{month:1, day:2}, want:"大吉"}, + {name:"1/3", fields:fields{month:1, day:3}, want:"大吉"}, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + w := httptest.NewRecorder() + r := httptest.NewRequest("GET", "/", nil) + loc, _ := time.LoadLocation("Asia/Tokyo") + date := time.Date(2018, tt.fields.month, tt.fields.day, 0, 0, 0, 0, loc) + OmikujiHandler{DateProvider: ArbitraryTimeProvider{time: date}}.ServeHTTP(w, r) + rw := w.Result() + defer rw.Body.Close() + decoder := json.NewDecoder(rw.Body) + var result result + if err := decoder.Decode(&result); err != nil { + log.Fatal(err) + } + if !reflect.DeepEqual(result.Data, tt.want) { + t.Errorf("omikujiHandler = %v, want %v", result.Data, tt.want) + } + }) + } +} diff --git a/kadai4/mukai/main.go b/kadai4/mukai/main.go new file mode 100644 index 0000000..3634aa2 --- /dev/null +++ b/kadai4/mukai/main.go @@ -0,0 +1,17 @@ +package main + +import ( + "dojo2/kadai4/mukai/handler" + "math/rand" + "net/http" + "time" +) + +func init() { + rand.Seed(time.Now().UnixNano()) +} + +func main() { + http.Handle("/", handler.HeaderMiddleWare(handler.OmikujiHandler{DateProvider: handler.NowTimeProvider{}})) + http.ListenAndServe(":8080", nil) +} From eb53dac834faf238b0c40a181baff39edf0f984f Mon Sep 17 00:00:00 2001 From: mukai_masaki Date: Thu, 12 Jul 2018 02:01:25 +0900 Subject: [PATCH 2/3] =?UTF-8?q?readme=E8=BF=BD=E5=8A=A0.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- kadai4/mukai/README.md | 41 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) create mode 100644 kadai4/mukai/README.md diff --git a/kadai4/mukai/README.md b/kadai4/mukai/README.md new file mode 100644 index 0000000..60a8422 --- /dev/null +++ b/kadai4/mukai/README.md @@ -0,0 +1,41 @@ +# 実行例 +``` + curl -v http://localhost:8080 +* Rebuilt URL to: http://localhost:8080/ +* Trying ::1... +* Connected to localhost (::1) port 8080 (#0) +> GET / HTTP/1.1 +> Host: localhost:8080 +> User-Agent: curl/7.43.0 +> Accept: */* +> +< HTTP/1.1 200 OK +< Content-Type: application/json; charset=utf-8 +< Date: Wed, 11 Jul 2018 16:57:05 GMT +< Content-Length: 19 +< +{"data":"大吉"} + +curl -v http://localhost:8080 +* Rebuilt URL to: http://localhost:8080/ +* Trying ::1... +* Connected to localhost (::1) port 8080 (#0) +> GET / HTTP/1.1 +> Host: localhost:8080 +> User-Agent: curl/7.43.0 +> Accept: */* +> +< HTTP/1.1 200 OK +< Content-Type: application/json; charset=utf-8 +< Date: Wed, 11 Jul 2018 16:57:14 GMT +< Content-Length: 16 +< +{"data":"凶"} + +``` + +# 指定日のテスト +おみくじをひく日時を返却するメソッドを持ったインタフェースをHandlerにもたせる. + +本番実装では、実行時の日地を返却するメソッドを持った構造体を渡し、テスト時には任意の日時を返却する構造体を渡すことで、実装を変えずに任意の日付のおみくじ結果を取得できる. + From 53a145130ca59173876ce391fb3fe273a6185e93 Mon Sep 17 00:00:00 2001 From: mukai_masaki Date: Thu, 12 Jul 2018 02:04:14 +0900 Subject: [PATCH 3/3] refactoring. --- kadai4/mukai/handler/dateProvider.go | 11 +++++++---- kadai4/mukai/handler/omikujiHandler.go | 6 +++--- kadai4/mukai/handler/omikujiHandler_test.go | 2 +- kadai4/mukai/main.go | 2 +- 4 files changed, 12 insertions(+), 9 deletions(-) diff --git a/kadai4/mukai/handler/dateProvider.go b/kadai4/mukai/handler/dateProvider.go index 1a13708..9b14a6a 100644 --- a/kadai4/mukai/handler/dateProvider.go +++ b/kadai4/mukai/handler/dateProvider.go @@ -2,17 +2,20 @@ package handler import "time" -type DateProvider interface { - Now() time.Time +type TimeProvider interface { + Time() time.Time } + type NowTimeProvider struct { } -func (p NowTimeProvider) Now() time.Time { +// 実行時の日時を返却する. +func (p NowTimeProvider) Time() time.Time { return time.Now() } type ArbitraryTimeProvider struct { time time.Time } -func (p ArbitraryTimeProvider) Now() time.Time { +// ArbitraryTimeProviderに設定した任意の日時を返却する. +func (p ArbitraryTimeProvider) Time() time.Time { return p.time } diff --git a/kadai4/mukai/handler/omikujiHandler.go b/kadai4/mukai/handler/omikujiHandler.go index 0f858f8..2375bf0 100644 --- a/kadai4/mukai/handler/omikujiHandler.go +++ b/kadai4/mukai/handler/omikujiHandler.go @@ -9,7 +9,7 @@ import ( ) type OmikujiHandler struct { - DateProvider DateProvider + TimeProvider TimeProvider } func (o OmikujiHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) { result := result{Data: o.omikuji()} @@ -21,8 +21,8 @@ func (o OmikujiHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) { } func (o OmikujiHandler) omikuji() string { - now := o.DateProvider.Now() - if now.Month() == 1 && (1 <= now.Day() && now.Day() <= 3) { + time := o.TimeProvider.Time() + if time.Month() == 1 && (1 <= time.Day() && time.Day() <= 3) { return "大吉" } i := rand.Intn(4) diff --git a/kadai4/mukai/handler/omikujiHandler_test.go b/kadai4/mukai/handler/omikujiHandler_test.go index b16bfda..40cd015 100644 --- a/kadai4/mukai/handler/omikujiHandler_test.go +++ b/kadai4/mukai/handler/omikujiHandler_test.go @@ -30,7 +30,7 @@ func TestOmikujiHandler(t *testing.T) { r := httptest.NewRequest("GET", "/", nil) loc, _ := time.LoadLocation("Asia/Tokyo") date := time.Date(2018, tt.fields.month, tt.fields.day, 0, 0, 0, 0, loc) - OmikujiHandler{DateProvider: ArbitraryTimeProvider{time: date}}.ServeHTTP(w, r) + OmikujiHandler{TimeProvider: ArbitraryTimeProvider{time: date}}.ServeHTTP(w, r) rw := w.Result() defer rw.Body.Close() decoder := json.NewDecoder(rw.Body) diff --git a/kadai4/mukai/main.go b/kadai4/mukai/main.go index 3634aa2..283b6c3 100644 --- a/kadai4/mukai/main.go +++ b/kadai4/mukai/main.go @@ -12,6 +12,6 @@ func init() { } func main() { - http.Handle("/", handler.HeaderMiddleWare(handler.OmikujiHandler{DateProvider: handler.NowTimeProvider{}})) + http.Handle("/", handler.HeaderMiddleWare(handler.OmikujiHandler{TimeProvider: handler.NowTimeProvider{}})) http.ListenAndServe(":8080", nil) }