From f5a4ecb06d730bea210dd10f065807976e8dfa99 Mon Sep 17 00:00:00 2001 From: Kazue Sasatani Date: Sun, 26 Jul 2020 22:48:13 +0900 Subject: [PATCH 1/6] Added Initial code --- kadai4/segakazzz/.gitignore | 1 + kadai4/segakazzz/README.md | 5 ++ kadai4/segakazzz/cmd/go.mod | 7 +++ kadai4/segakazzz/cmd/main.go | 9 ++++ kadai4/segakazzz/omikuji/go.mod | 3 ++ kadai4/segakazzz/omikuji/omikuji.go | 81 +++++++++++++++++++++++++++++ 6 files changed, 106 insertions(+) create mode 100644 kadai4/segakazzz/.gitignore create mode 100644 kadai4/segakazzz/README.md create mode 100644 kadai4/segakazzz/cmd/go.mod create mode 100644 kadai4/segakazzz/cmd/main.go create mode 100644 kadai4/segakazzz/omikuji/go.mod create mode 100644 kadai4/segakazzz/omikuji/omikuji.go diff --git a/kadai4/segakazzz/.gitignore b/kadai4/segakazzz/.gitignore new file mode 100644 index 0000000..723ef36 --- /dev/null +++ b/kadai4/segakazzz/.gitignore @@ -0,0 +1 @@ +.idea \ No newline at end of file diff --git a/kadai4/segakazzz/README.md b/kadai4/segakazzz/README.md new file mode 100644 index 0000000..c9dad1d --- /dev/null +++ b/kadai4/segakazzz/README.md @@ -0,0 +1,5 @@ +#【TRY】おみくじAPI +## おみくじAPIを作ってみよう +- JSON形式でおみくじの結果を返す +- 正月(1/1-1/3)だけ大吉にする +- ハンドラのテストを書いてみる diff --git a/kadai4/segakazzz/cmd/go.mod b/kadai4/segakazzz/cmd/go.mod new file mode 100644 index 0000000..28aec6c --- /dev/null +++ b/kadai4/segakazzz/cmd/go.mod @@ -0,0 +1,7 @@ +module github.com/gopherdojo/dojo8/kadai4/segakazzz/cmd + +go 1.14 + +replace github.com/gopherdojo/dojo8/kadai4/segakazzz/omikuji => ../omikuji + +require github.com/gopherdojo/dojo8/kadai4/segakazzz/omikuji v0.0.0-00010101000000-000000000000 // indirect diff --git a/kadai4/segakazzz/cmd/main.go b/kadai4/segakazzz/cmd/main.go new file mode 100644 index 0000000..eb9785d --- /dev/null +++ b/kadai4/segakazzz/cmd/main.go @@ -0,0 +1,9 @@ +package main + +import ( + "github.com/gopherdojo/dojo8/kadai4/segakazzz/omikuji" +) + +func main() { + omikuji.Run() +} diff --git a/kadai4/segakazzz/omikuji/go.mod b/kadai4/segakazzz/omikuji/go.mod new file mode 100644 index 0000000..dfc9aa0 --- /dev/null +++ b/kadai4/segakazzz/omikuji/go.mod @@ -0,0 +1,3 @@ +module github.com/gopherdojo/dojo8/kadai4/segakazzz/omikuji + +go 1.14 diff --git a/kadai4/segakazzz/omikuji/omikuji.go b/kadai4/segakazzz/omikuji/omikuji.go new file mode 100644 index 0000000..63e5458 --- /dev/null +++ b/kadai4/segakazzz/omikuji/omikuji.go @@ -0,0 +1,81 @@ +package omikuji + +import ( + "encoding/json" + "fmt" + "math/rand" + "net/http" + "time" +) + +type Omikuji struct { + DateTime time.Time `json:"time"` + Dice int `json:"dice"` + Result string `json:"result"` +} + +func newOmikuji() *Omikuji { + return &Omikuji{DateTime:time.Now()} +} + +func (o *Omikuji) omikujiHandler(w http.ResponseWriter, r *http.Request) { + err := o.tryOmikuji() + if err != nil { + http.Error(w, err.Error(), http.StatusInternalServerError) + return + } + + js, err := json.Marshal(o) + if err != nil { + http.Error(w, err.Error(), http.StatusInternalServerError) + return + } + w.Header().Set("Content-Type", "application/json") + w.Write(js) +} + +func Run() { + o := newOmikuji() + http.HandleFunc("/", o.omikujiHandler) + http.ListenAndServe(":8080", nil) +} + +func (o *Omikuji)throwOneToSix() int { + rand.Seed(time.Now().UnixNano()) + i := rand.Intn(6) + return i + 1 +} + +func (o *Omikuji)intToStr(n int) (string, error) { + switch n { + case 1: + return "凶", nil + case 2, 3: + return "吉", nil + case 4, 5: + return "中吉", nil + case 6: + return "大吉", nil + default: + return "", fmt.Errorf("invalid number %d", n) + } +} + +func (o *Omikuji) tryOmikuji() error { + var err error + if !o.isNewYearHoliday(){ + o.Dice = o.throwOneToSix() + } else { + o.Dice = 6 + } + o.Result, err = o.intToStr(o.Dice) + return err +} + +func (o *Omikuji) isNewYearHoliday () bool { + _, m, d := o.DateTime.Date() + if int(m) == 1 && d <= 3{ + return true + } + return false +} From ee68634c9105ad77c89115aceeb76808a3d2f749 Mon Sep 17 00:00:00 2001 From: Kazue Sasatani Date: Wed, 29 Jul 2020 09:31:08 +0900 Subject: [PATCH 2/6] Modified main, added port selection & error handling --- kadai4/segakazzz/.gitignore | 3 +- kadai4/segakazzz/README.md | 21 +++ kadai4/segakazzz/cmd/go.mod | 5 +- kadai4/segakazzz/cmd/go.sum | 2 + kadai4/segakazzz/cmd/main.go | 17 ++- kadai4/segakazzz/omikuji/omikuji.go | 16 +- kadai4/segakazzz/omikuji/omikuji_test.go | 182 +++++++++++++++++++++++ 7 files changed, 239 insertions(+), 7 deletions(-) create mode 100644 kadai4/segakazzz/cmd/go.sum create mode 100644 kadai4/segakazzz/omikuji/omikuji_test.go diff --git a/kadai4/segakazzz/.gitignore b/kadai4/segakazzz/.gitignore index 723ef36..a4ebc28 100644 --- a/kadai4/segakazzz/.gitignore +++ b/kadai4/segakazzz/.gitignore @@ -1 +1,2 @@ -.idea \ No newline at end of file +.idea +cmd/omkj \ No newline at end of file diff --git a/kadai4/segakazzz/README.md b/kadai4/segakazzz/README.md index c9dad1d..25f4f1d 100644 --- a/kadai4/segakazzz/README.md +++ b/kadai4/segakazzz/README.md @@ -3,3 +3,24 @@ - JSON形式でおみくじの結果を返す - 正月(1/1-1/3)だけ大吉にする - ハンドラのテストを書いてみる + +## 回答 +### 実行方法 +~~~ +$ cd cmd +$ go build -o omkj main.go +$ ./omkj +Server is running with port 8080👍 +~~~ +上記実行後任意のブラウザでアクセスすると以下のような結果が帰ってくる +~~~ +{ + "time": "2020-07-26T22:54:31.541464+09:00", + "dice": 1, + "result": "凶" +} +~~~ + +### 処理説明補足 +- 以前作成した[Try]おみくじプログラムを作ろうを応用しました。 + diff --git a/kadai4/segakazzz/cmd/go.mod b/kadai4/segakazzz/cmd/go.mod index 28aec6c..7c1acd3 100644 --- a/kadai4/segakazzz/cmd/go.mod +++ b/kadai4/segakazzz/cmd/go.mod @@ -4,4 +4,7 @@ go 1.14 replace github.com/gopherdojo/dojo8/kadai4/segakazzz/omikuji => ../omikuji -require github.com/gopherdojo/dojo8/kadai4/segakazzz/omikuji v0.0.0-00010101000000-000000000000 // indirect +require ( + github.com/gopherdojo/dojo8/kadai4/segakazzz/omikuji v0.0.0-00010101000000-000000000000 // indirect + github.com/pkg/errors v0.9.1 // indirect +) diff --git a/kadai4/segakazzz/cmd/go.sum b/kadai4/segakazzz/cmd/go.sum new file mode 100644 index 0000000..7c401c3 --- /dev/null +++ b/kadai4/segakazzz/cmd/go.sum @@ -0,0 +1,2 @@ +github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= +github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= diff --git a/kadai4/segakazzz/cmd/main.go b/kadai4/segakazzz/cmd/main.go index eb9785d..e346706 100644 --- a/kadai4/segakazzz/cmd/main.go +++ b/kadai4/segakazzz/cmd/main.go @@ -1,9 +1,24 @@ package main import ( + "flag" + "fmt" "github.com/gopherdojo/dojo8/kadai4/segakazzz/omikuji" + "os" ) +var port int + +func init() { + flag.IntVar(&port, "p", 8080, "Port Number to serve http") +} + func main() { - omikuji.Run() + flag.Parse() + err := omikuji.Run(port) + if err != nil { + fmt.Println(err) + os.Exit(1) + } + os.Exit(0) } diff --git a/kadai4/segakazzz/omikuji/omikuji.go b/kadai4/segakazzz/omikuji/omikuji.go index 63e5458..1a1de6a 100644 --- a/kadai4/segakazzz/omikuji/omikuji.go +++ b/kadai4/segakazzz/omikuji/omikuji.go @@ -3,8 +3,10 @@ package omikuji import ( "encoding/json" "fmt" + "github.com/pkg/errors" "math/rand" "net/http" + "strconv" "time" ) @@ -15,7 +17,7 @@ type Omikuji struct { } func newOmikuji() *Omikuji { - return &Omikuji{DateTime:time.Now()} + return &Omikuji{} } func (o *Omikuji) omikujiHandler(w http.ResponseWriter, r *http.Request) { @@ -34,14 +36,19 @@ func (o *Omikuji) omikujiHandler(w http.ResponseWriter, r *http.Request) { w.Write(js) } -func Run() { +func Run(port int) error { o := newOmikuji() http.HandleFunc("/", o.omikujiHandler) - http.ListenAndServe(":8080", nil) + fmt.Println("Server is starting with port " +strconv.Itoa(port), "👍") + err := http.ListenAndServe(":" + strconv.Itoa(port), nil) + if err != nil { + return errors.Wrapf(err, "Error in Run()\n") + } + return nil } func (o *Omikuji)throwOneToSix() int { - rand.Seed(time.Now().UnixNano()) + rand.Seed(o.DateTime.UnixNano()) i := rand.Intn(6) return i + 1 } @@ -63,6 +70,7 @@ func (o *Omikuji)intToStr(n int) (string, error) { func (o *Omikuji) tryOmikuji() error { var err error + o.DateTime = time.Now() if !o.isNewYearHoliday(){ o.Dice = o.throwOneToSix() } else { diff --git a/kadai4/segakazzz/omikuji/omikuji_test.go b/kadai4/segakazzz/omikuji/omikuji_test.go new file mode 100644 index 0000000..d0d36ca --- /dev/null +++ b/kadai4/segakazzz/omikuji/omikuji_test.go @@ -0,0 +1,182 @@ +package omikuji + +import ( + "net/http" + "reflect" + "testing" + "time" +) + +func TestOmikuji_intToStr(t *testing.T) { + type fields struct { + DateTime time.Time + Dice int + Result string + } + type args struct { + n int + } + tests := []struct { + name string + fields fields + args args + want string + wantErr bool + }{ + // TODO: Add test cases. + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + o := &Omikuji{ + DateTime: tt.fields.DateTime, + Dice: tt.fields.Dice, + Result: tt.fields.Result, + } + got, err := o.intToStr(tt.args.n) + if (err != nil) != tt.wantErr { + t.Errorf("intToStr() error = %v, wantErr %v", err, tt.wantErr) + return + } + if got != tt.want { + t.Errorf("intToStr() got = %v, want %v", got, tt.want) + } + }) + } +} + +func TestOmikuji_isNewYearHoliday(t *testing.T) { + type fields struct { + DateTime time.Time + Dice int + Result string + } + tests := []struct { + name string + fields fields + want bool + }{ + // TODO: Add test cases. + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + o := &Omikuji{ + DateTime: tt.fields.DateTime, + Dice: tt.fields.Dice, + Result: tt.fields.Result, + } + if got := o.isNewYearHoliday(); got != tt.want { + t.Errorf("isNewYearHoliday() = %v, want %v", got, tt.want) + } + }) + } +} + +func TestOmikuji_omikujiHandler(t *testing.T) { + type fields struct { + DateTime time.Time + Dice int + Result string + } + type args struct { + w http.ResponseWriter + r *http.Request + } + tests := []struct { + name string + fields fields + args args + }{ + // TODO: Add test cases. + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + o := &Omikuji{ + DateTime: tt.fields.DateTime, + Dice: tt.fields.Dice, + Result: tt.fields.Result, + } + }) + } +} + +func TestOmikuji_throwOneToSix(t *testing.T) { + type fields struct { + DateTime time.Time + Dice int + Result string + } + tests := []struct { + name string + fields fields + want int + }{ + // TODO: Add test cases. + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + o := &Omikuji{ + DateTime: tt.fields.DateTime, + Dice: tt.fields.Dice, + Result: tt.fields.Result, + } + if got := o.throwOneToSix(); got != tt.want { + t.Errorf("throwOneToSix() = %v, want %v", got, tt.want) + } + }) + } +} + +func TestOmikuji_tryOmikuji(t *testing.T) { + type fields struct { + DateTime time.Time + Dice int + Result string + } + tests := []struct { + name string + fields fields + wantErr bool + }{ + // TODO: Add test cases. + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + o := &Omikuji{ + DateTime: tt.fields.DateTime, + Dice: tt.fields.Dice, + Result: tt.fields.Result, + } + if err := o.tryOmikuji(); (err != nil) != tt.wantErr { + t.Errorf("tryOmikuji() error = %v, wantErr %v", err, tt.wantErr) + } + }) + } +} + +func TestRun(t *testing.T) { + tests := []struct { + name string + }{ + // TODO: Add test cases. + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + }) + } +} + +func Test_newOmikuji(t *testing.T) { + tests := []struct { + name string + want *Omikuji + }{ + // TODO: Add test cases. + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + if got := newOmikuji(); !reflect.DeepEqual(got, tt.want) { + t.Errorf("newOmikuji() = %v, want %v", got, tt.want) + } + }) + } +} \ No newline at end of file From 8995cdde14cf130695b6cc67a598720084dd2347 Mon Sep 17 00:00:00 2001 From: Kazue Sasatani Date: Wed, 29 Jul 2020 17:00:39 +0900 Subject: [PATCH 3/6] Added partial testing --- kadai4/segakazzz/omikuji/export_test.go | 19 +++ kadai4/segakazzz/omikuji/go.mod | 2 + kadai4/segakazzz/omikuji/go.sum | 2 + kadai4/segakazzz/omikuji/omikuji.go | 20 ++- kadai4/segakazzz/omikuji/omikuji_test.go | 148 +++++++++++++++++------ 5 files changed, 153 insertions(+), 38 deletions(-) create mode 100644 kadai4/segakazzz/omikuji/export_test.go create mode 100644 kadai4/segakazzz/omikuji/go.sum diff --git a/kadai4/segakazzz/omikuji/export_test.go b/kadai4/segakazzz/omikuji/export_test.go new file mode 100644 index 0000000..23b3a33 --- /dev/null +++ b/kadai4/segakazzz/omikuji/export_test.go @@ -0,0 +1,19 @@ +package omikuji + +import "fmt" + +var NewOmikuji = newOmikuji +var OmikujiHandler = (*Omikuji).omikujiHandler +var ThrowOneToSix = (*Omikuji).throwOneToSix +var IntToStr = (*Omikuji).intToStr +var IsNewYearHoliday = (*Omikuji).isNewYearHoliday +var GenJson = (*Omikuji).genJson +var TryOmikuji = (*Omikuji).tryOmikuji + +var StdStdMethods = StdMethods + +var ErrStdMethods = stdLibProvider{ + jsonMarshal: func(v interface{}) ([]byte, error){ + return nil, fmt.Errorf("json.marshal dummy error...") + }, +} diff --git a/kadai4/segakazzz/omikuji/go.mod b/kadai4/segakazzz/omikuji/go.mod index dfc9aa0..27404fc 100644 --- a/kadai4/segakazzz/omikuji/go.mod +++ b/kadai4/segakazzz/omikuji/go.mod @@ -1,3 +1,5 @@ module github.com/gopherdojo/dojo8/kadai4/segakazzz/omikuji go 1.14 + +require github.com/pkg/errors v0.9.1 diff --git a/kadai4/segakazzz/omikuji/go.sum b/kadai4/segakazzz/omikuji/go.sum new file mode 100644 index 0000000..7c401c3 --- /dev/null +++ b/kadai4/segakazzz/omikuji/go.sum @@ -0,0 +1,2 @@ +github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= +github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= diff --git a/kadai4/segakazzz/omikuji/omikuji.go b/kadai4/segakazzz/omikuji/omikuji.go index 1a1de6a..30f8bf2 100644 --- a/kadai4/segakazzz/omikuji/omikuji.go +++ b/kadai4/segakazzz/omikuji/omikuji.go @@ -16,6 +16,14 @@ type Omikuji struct { Result string `json:"result"` } +type stdLibProvider struct { + jsonMarshal func(v interface{}) ([]byte, error) +} + +var StdMethods = stdLibProvider{ + jsonMarshal: json.Marshal, +} + func newOmikuji() *Omikuji { return &Omikuji{} } @@ -26,11 +34,9 @@ func (o *Omikuji) omikujiHandler(w http.ResponseWriter, r *http.Request) { http.Error(w, err.Error(), http.StatusInternalServerError) return } - - js, err := json.Marshal(o) + js, err := o.genJson() if err != nil { http.Error(w, err.Error(), http.StatusInternalServerError) - return } w.Header().Set("Content-Type", "application/json") w.Write(js) @@ -80,6 +86,14 @@ func (o *Omikuji) tryOmikuji() error { return err } +func (o *Omikuji) genJson() ([]byte, error) { + js, err := StdMethods.jsonMarshal(o) + if err != nil { + return nil, err + } + return js, nil +} + func (o *Omikuji) isNewYearHoliday () bool { _, m, d := o.DateTime.Date() if int(m) == 1 && d <= 3{ diff --git a/kadai4/segakazzz/omikuji/omikuji_test.go b/kadai4/segakazzz/omikuji/omikuji_test.go index d0d36ca..a1a476f 100644 --- a/kadai4/segakazzz/omikuji/omikuji_test.go +++ b/kadai4/segakazzz/omikuji/omikuji_test.go @@ -1,104 +1,174 @@ -package omikuji +package omikuji_test import ( - "net/http" + "github.com/gopherdojo/dojo8/kadai4/segakazzz/omikuji" "reflect" "testing" "time" ) -func TestOmikuji_intToStr(t *testing.T) { +func TestOmikuji_genJson(t *testing.T) { type fields struct { DateTime time.Time Dice int Result string } - type args struct { - n int - } tests := []struct { name string fields fields - args args want string wantErr bool }{ - // TODO: Add test cases. + { + name: "Expects Success 1", + fields: fields{ + DateTime: time.Date(2009, time.November, 10, 23, 0, 0, 0, time.UTC), + Dice: 1, + Result: "凶", + }, + want: "{\"time\":\"2009-11-10T23:00:00Z\",\"dice\":1,\"result\":\"凶\"}", + wantErr: false, + }, + { + name: "Expects Error", + fields: fields{ + DateTime: time.Date(2020, time.July, 21, 5, 9, 23, 3424, time.UTC), + Dice: 6, + Result: "大吉", + }, + want: "", + wantErr: true, + }, + { + name: "Expects Success 2", + fields: fields{ + DateTime: time.Date(2020, time.July, 21, 5, 9, 23, 3424, time.UTC), + Dice: 6, + Result: "大吉", + }, + want: "{\"time\":\"2020-07-21T05:09:23.000003424Z\",\"dice\":6,\"result\":\"大吉\"}", + wantErr: false, + }, + } for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { - o := &Omikuji{ + o := &omikuji.Omikuji{ DateTime: tt.fields.DateTime, Dice: tt.fields.Dice, Result: tt.fields.Result, } - got, err := o.intToStr(tt.args.n) + if tt.wantErr == true { + omikuji.StdMethods = omikuji.ErrStdMethods + } else { + omikuji.StdMethods = omikuji.StdStdMethods + } + + got, err := omikuji.GenJson(o) if (err != nil) != tt.wantErr { - t.Errorf("intToStr() error = %v, wantErr %v", err, tt.wantErr) + t.Errorf("genJson() error = %v, wantErr %v", err, tt.wantErr) return } - if got != tt.want { - t.Errorf("intToStr() got = %v, want %v", got, tt.want) + if !reflect.DeepEqual(string(got), tt.want) { + t.Errorf("genJson() got = %v, want %v", string(got), string(tt.want)) } }) } } -func TestOmikuji_isNewYearHoliday(t *testing.T) { +func TestOmikuji_intToStr(t *testing.T) { type fields struct { DateTime time.Time Dice int Result string } + type args struct { + n int + } tests := []struct { - name string - fields fields - want bool + name string + fields fields + args args + want string + wantErr bool }{ // TODO: Add test cases. } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - o := &Omikuji{ + o := &omikuji.Omikuji{ DateTime: tt.fields.DateTime, Dice: tt.fields.Dice, Result: tt.fields.Result, } - if got := o.isNewYearHoliday(); got != tt.want { - t.Errorf("isNewYearHoliday() = %v, want %v", got, tt.want) + got, err := omikuji.IntToStr(o, tt.args.n) + if (err != nil) != tt.wantErr { + t.Errorf("intToStr() error = %v, wantErr %v", err, tt.wantErr) + return + } + if got != tt.want { + t.Errorf("intToStr() got = %v, want %v", got, tt.want) } }) } } -func TestOmikuji_omikujiHandler(t *testing.T) { +func TestOmikuji_isNewYearHoliday(t *testing.T) { type fields struct { DateTime time.Time Dice int Result string } - type args struct { - w http.ResponseWriter - r *http.Request - } tests := []struct { name string fields fields - args args + want bool }{ // TODO: Add test cases. } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - o := &Omikuji{ + o := &omikuji.Omikuji{ DateTime: tt.fields.DateTime, Dice: tt.fields.Dice, Result: tt.fields.Result, } + if got := omikuji.IsNewYearHoliday(o); got != tt.want { + t.Errorf("isNewYearHoliday() = %v, want %v", got, tt.want) + } }) } } +//func TestOmikuji_omikujiHandler(t *testing.T) { +// type fields struct { +// DateTime time.Time +// Dice int +// Result string +// } +// type args struct { +// w http.ResponseWriter +// r *http.Request +// } +// tests := []struct { +// name string +// fields fields +// args args +// }{ +// // TODO: Add test cases. +// } +// for _, tt := range tests { +// t.Run(tt.name, func(t *testing.T) { +// o := &omikuji.Omikuji{ +// DateTime: tt.fields.DateTime, +// Dice: tt.fields.Dice, +// Result: tt.fields.Result, +// } +// }) +// } +//} + func TestOmikuji_throwOneToSix(t *testing.T) { type fields struct { DateTime time.Time @@ -114,12 +184,12 @@ func TestOmikuji_throwOneToSix(t *testing.T) { } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - o := &Omikuji{ + o := &omikuji.Omikuji{ DateTime: tt.fields.DateTime, Dice: tt.fields.Dice, Result: tt.fields.Result, } - if got := o.throwOneToSix(); got != tt.want { + if got := omikuji.ThrowOneToSix(o); got != tt.want { t.Errorf("throwOneToSix() = %v, want %v", got, tt.want) } }) @@ -141,12 +211,12 @@ func TestOmikuji_tryOmikuji(t *testing.T) { } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - o := &Omikuji{ + o := &omikuji.Omikuji{ DateTime: tt.fields.DateTime, Dice: tt.fields.Dice, Result: tt.fields.Result, } - if err := o.tryOmikuji(); (err != nil) != tt.wantErr { + if err := omikuji.TryOmikuji(o); (err != nil) != tt.wantErr { t.Errorf("tryOmikuji() error = %v, wantErr %v", err, tt.wantErr) } }) @@ -154,13 +224,21 @@ func TestOmikuji_tryOmikuji(t *testing.T) { } func TestRun(t *testing.T) { + type args struct { + port int + } tests := []struct { - name string + name string + args args + wantErr bool }{ // TODO: Add test cases. } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { + if err := omikuji.Run(tt.args.port); (err != nil) != tt.wantErr { + t.Errorf("Run() error = %v, wantErr %v", err, tt.wantErr) + } }) } } @@ -168,15 +246,15 @@ func TestRun(t *testing.T) { func Test_newOmikuji(t *testing.T) { tests := []struct { name string - want *Omikuji + want *omikuji.Omikuji }{ // TODO: Add test cases. } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - if got := newOmikuji(); !reflect.DeepEqual(got, tt.want) { + if got := omikuji.NewOmikuji(); !reflect.DeepEqual(got, tt.want) { t.Errorf("newOmikuji() = %v, want %v", got, tt.want) } }) } -} \ No newline at end of file +} From 263cc9b32a5157bc44448b9deca28428d5d9c4aa Mon Sep 17 00:00:00 2001 From: Kazue Sasatani Date: Wed, 29 Jul 2020 19:57:23 +0900 Subject: [PATCH 4/6] Added more tests --- kadai4/segakazzz/omikuji/export_test.go | 6 ++ kadai4/segakazzz/omikuji/omikuji.go | 4 +- kadai4/segakazzz/omikuji/omikuji_test.go | 92 ++++++++++++++++++++---- 3 files changed, 89 insertions(+), 13 deletions(-) diff --git a/kadai4/segakazzz/omikuji/export_test.go b/kadai4/segakazzz/omikuji/export_test.go index 23b3a33..bccc390 100644 --- a/kadai4/segakazzz/omikuji/export_test.go +++ b/kadai4/segakazzz/omikuji/export_test.go @@ -17,3 +17,9 @@ var ErrStdMethods = stdLibProvider{ return nil, fmt.Errorf("json.marshal dummy error...") }, } + +var MockStdMethods = stdLibProvider{ + randIntn:func(i int) int { + return 5 + }, +} diff --git a/kadai4/segakazzz/omikuji/omikuji.go b/kadai4/segakazzz/omikuji/omikuji.go index 30f8bf2..112eaca 100644 --- a/kadai4/segakazzz/omikuji/omikuji.go +++ b/kadai4/segakazzz/omikuji/omikuji.go @@ -18,10 +18,12 @@ type Omikuji struct { type stdLibProvider struct { jsonMarshal func(v interface{}) ([]byte, error) + randIntn func(int) int } var StdMethods = stdLibProvider{ jsonMarshal: json.Marshal, + randIntn: rand.Intn, } func newOmikuji() *Omikuji { @@ -55,7 +57,7 @@ func Run(port int) error { func (o *Omikuji)throwOneToSix() int { rand.Seed(o.DateTime.UnixNano()) - i := rand.Intn(6) + i := StdMethods.randIntn(6) return i + 1 } diff --git a/kadai4/segakazzz/omikuji/omikuji_test.go b/kadai4/segakazzz/omikuji/omikuji_test.go index a1a476f..0349964 100644 --- a/kadai4/segakazzz/omikuji/omikuji_test.go +++ b/kadai4/segakazzz/omikuji/omikuji_test.go @@ -26,7 +26,7 @@ func TestOmikuji_genJson(t *testing.T) { Dice: 1, Result: "凶", }, - want: "{\"time\":\"2009-11-10T23:00:00Z\",\"dice\":1,\"result\":\"凶\"}", + want: "{\"time\":\"2009-11-10T23:00:00Z\",\"dice\":1,\"result\":\"凶\"}", wantErr: false, }, { @@ -36,7 +36,7 @@ func TestOmikuji_genJson(t *testing.T) { Dice: 6, Result: "大吉", }, - want: "", + want: "", wantErr: true, }, { @@ -46,10 +46,9 @@ func TestOmikuji_genJson(t *testing.T) { Dice: 6, Result: "大吉", }, - want: "{\"time\":\"2020-07-21T05:09:23.000003424Z\",\"dice\":6,\"result\":\"大吉\"}", + want: "{\"time\":\"2020-07-21T05:09:23.000003424Z\",\"dice\":6,\"result\":\"大吉\"}", wantErr: false, }, - } for _, tt := range tests { @@ -93,7 +92,41 @@ func TestOmikuji_intToStr(t *testing.T) { want string wantErr bool }{ - // TODO: Add test cases. + { + name: "Success Dice 1", + fields: fields{}, + args: args{n: 1}, + want: "凶", + wantErr: false, + }, + { + name: "Success Dice 2", + fields: fields{}, + args: args{n: 2}, + want: "吉", + wantErr: false, + }, + { + name: "Success Dice 4", + fields: fields{}, + args: args{n: 4}, + want: "中吉", + wantErr: false, + }, + { + name: "Success Dice 6", + fields: fields{}, + args: args{n: 6}, + want: "大吉", + wantErr: false, + }, + { + name: "Error Dice", + fields: fields{}, + args: args{n: 1000}, + want: "", + wantErr: true, + }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { @@ -125,7 +158,35 @@ func TestOmikuji_isNewYearHoliday(t *testing.T) { fields fields want bool }{ - // TODO: Add test cases. + { + name: "Not New Year 1", + fields: fields{ + DateTime: time.Date(2020, time.July, 21, 5, 9, 23, 3424, time.UTC), + }, + want: false, + }, + { + name: "Not New Year 2", + fields: fields{ + DateTime: time.Date(2020, time.December, 31, 23, 59, 59, 123445, time.UTC), + }, + want: false, + }, + { + name: "New Year 1", + fields: fields{ + DateTime: time.Date(2020, time.January, 3, 6, 34, 55, 343424, time.UTC), + }, + want: true, + }, + { + name: "New Year 2", + fields: fields{ + DateTime: time.Date(2020, time.January, 1, 0, 00, 00, 343424, time.UTC), + }, + want: true, + }, + } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { @@ -180,7 +241,11 @@ func TestOmikuji_throwOneToSix(t *testing.T) { fields fields want int }{ - // TODO: Add test cases. + { + name: "Success", + fields: fields{}, + want: 6, + }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { @@ -189,6 +254,7 @@ func TestOmikuji_throwOneToSix(t *testing.T) { Dice: tt.fields.Dice, Result: tt.fields.Result, } + omikuji.StdMethods = omikuji.MockStdMethods if got := omikuji.ThrowOneToSix(o); got != tt.want { t.Errorf("throwOneToSix() = %v, want %v", got, tt.want) } @@ -198,7 +264,7 @@ func TestOmikuji_throwOneToSix(t *testing.T) { func TestOmikuji_tryOmikuji(t *testing.T) { type fields struct { - DateTime time.Time + isNewYear bool Dice int Result string } @@ -211,11 +277,13 @@ func TestOmikuji_tryOmikuji(t *testing.T) { } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - o := &omikuji.Omikuji{ - DateTime: tt.fields.DateTime, - Dice: tt.fields.Dice, - Result: tt.fields.Result, + omikuji.IsNewYearHoliday = func (o *omikuji.Omikuji) bool { + return true + } + omikuji.ThrowOneToSix = func (o *omikuji.Omikuji) int { + return 6 } + o := &omikuji.Omikuji{} if err := omikuji.TryOmikuji(o); (err != nil) != tt.wantErr { t.Errorf("tryOmikuji() error = %v, wantErr %v", err, tt.wantErr) } From 09b0cb3bda80b04d3d80434eb83647e768a76459 Mon Sep 17 00:00:00 2001 From: Kazue Sasatani Date: Wed, 29 Jul 2020 23:24:49 +0900 Subject: [PATCH 5/6] Done writing test code --- kadai4/segakazzz/omikuji/coverprofile.out | 27 +++ kadai4/segakazzz/omikuji/export_test.go | 29 ++- kadai4/segakazzz/omikuji/omikuji.go | 24 ++- kadai4/segakazzz/omikuji/omikuji_test.go | 223 ++++++++++++++++------ 4 files changed, 227 insertions(+), 76 deletions(-) create mode 100644 kadai4/segakazzz/omikuji/coverprofile.out diff --git a/kadai4/segakazzz/omikuji/coverprofile.out b/kadai4/segakazzz/omikuji/coverprofile.out new file mode 100644 index 0000000..6252903 --- /dev/null +++ b/kadai4/segakazzz/omikuji/coverprofile.out @@ -0,0 +1,27 @@ +mode: set +github.com/gopherdojo/dojo8/kadai4/segakazzz/omikuji/omikuji.go:33.28,35.2 1 1 +github.com/gopherdojo/dojo8/kadai4/segakazzz/omikuji/omikuji.go:37.74,39.16 2 1 +github.com/gopherdojo/dojo8/kadai4/segakazzz/omikuji/omikuji.go:43.2,44.16 2 1 +github.com/gopherdojo/dojo8/kadai4/segakazzz/omikuji/omikuji.go:47.2,48.13 2 1 +github.com/gopherdojo/dojo8/kadai4/segakazzz/omikuji/omikuji.go:39.16,42.3 2 1 +github.com/gopherdojo/dojo8/kadai4/segakazzz/omikuji/omikuji.go:44.16,46.3 1 1 +github.com/gopherdojo/dojo8/kadai4/segakazzz/omikuji/omikuji.go:51.26,56.16 5 1 +github.com/gopherdojo/dojo8/kadai4/segakazzz/omikuji/omikuji.go:59.2,59.12 1 0 +github.com/gopherdojo/dojo8/kadai4/segakazzz/omikuji/omikuji.go:56.16,58.3 1 1 +github.com/gopherdojo/dojo8/kadai4/segakazzz/omikuji/omikuji.go:62.38,66.2 3 1 +github.com/gopherdojo/dojo8/kadai4/segakazzz/omikuji/omikuji.go:68.50,69.11 1 1 +github.com/gopherdojo/dojo8/kadai4/segakazzz/omikuji/omikuji.go:70.9,71.20 1 1 +github.com/gopherdojo/dojo8/kadai4/segakazzz/omikuji/omikuji.go:72.12,73.20 1 1 +github.com/gopherdojo/dojo8/kadai4/segakazzz/omikuji/omikuji.go:74.12,75.23 1 1 +github.com/gopherdojo/dojo8/kadai4/segakazzz/omikuji/omikuji.go:76.9,77.23 1 1 +github.com/gopherdojo/dojo8/kadai4/segakazzz/omikuji/omikuji.go:78.10,79.48 1 1 +github.com/gopherdojo/dojo8/kadai4/segakazzz/omikuji/omikuji.go:83.38,86.26 3 1 +github.com/gopherdojo/dojo8/kadai4/segakazzz/omikuji/omikuji.go:91.2,92.12 2 1 +github.com/gopherdojo/dojo8/kadai4/segakazzz/omikuji/omikuji.go:86.26,88.3 1 1 +github.com/gopherdojo/dojo8/kadai4/segakazzz/omikuji/omikuji.go:88.8,90.3 1 1 +github.com/gopherdojo/dojo8/kadai4/segakazzz/omikuji/omikuji.go:95.45,97.16 2 1 +github.com/gopherdojo/dojo8/kadai4/segakazzz/omikuji/omikuji.go:100.2,100.16 1 1 +github.com/gopherdojo/dojo8/kadai4/segakazzz/omikuji/omikuji.go:97.16,99.3 1 1 +github.com/gopherdojo/dojo8/kadai4/segakazzz/omikuji/omikuji.go:103.44,105.26 2 1 +github.com/gopherdojo/dojo8/kadai4/segakazzz/omikuji/omikuji.go:108.2,108.14 1 1 +github.com/gopherdojo/dojo8/kadai4/segakazzz/omikuji/omikuji.go:105.26,107.3 1 1 diff --git a/kadai4/segakazzz/omikuji/export_test.go b/kadai4/segakazzz/omikuji/export_test.go index bccc390..ed78c81 100644 --- a/kadai4/segakazzz/omikuji/export_test.go +++ b/kadai4/segakazzz/omikuji/export_test.go @@ -1,6 +1,9 @@ package omikuji -import "fmt" +import ( + "fmt" + "time" +) var NewOmikuji = newOmikuji var OmikujiHandler = (*Omikuji).omikujiHandler @@ -12,14 +15,30 @@ var TryOmikuji = (*Omikuji).tryOmikuji var StdStdMethods = StdMethods -var ErrStdMethods = stdLibProvider{ - jsonMarshal: func(v interface{}) ([]byte, error){ +var ErrStdMethods = StdLibProvider{ + JsonMarshal: func(v interface{}) ([]byte, error){ return nil, fmt.Errorf("json.marshal dummy error...") }, } -var MockStdMethods = stdLibProvider{ - randIntn:func(i int) int { +var MockStdMethods = StdLibProvider{ + RandIntn:func(i int) int { return 5 }, } + +var MockHoliday = StdLibProvider{ + TimeNow: func () time.Time { + return time.Date(2020, time.January, 1, 10,23,30,9, time.UTC) + }, +} + +var MockNotHoliday = StdLibProvider{ + TimeNow: func () time.Time { + return time.Date(2020, time.March, 1, 10,23,30,9, time.UTC) + }, + RandIntn:func(i int) int { + return 5 + }, +} + diff --git a/kadai4/segakazzz/omikuji/omikuji.go b/kadai4/segakazzz/omikuji/omikuji.go index 112eaca..c060454 100644 --- a/kadai4/segakazzz/omikuji/omikuji.go +++ b/kadai4/segakazzz/omikuji/omikuji.go @@ -16,14 +16,18 @@ type Omikuji struct { Result string `json:"result"` } -type stdLibProvider struct { - jsonMarshal func(v interface{}) ([]byte, error) - randIntn func(int) int +type StdLibProvider struct { + JsonMarshal func(v interface{}) ([]byte, error) + RandIntn func(int) int + TimeNow func() time.Time + HttpListenAndServe func (addr string, handler http.Handler) error } -var StdMethods = stdLibProvider{ - jsonMarshal: json.Marshal, - randIntn: rand.Intn, +var StdMethods = StdLibProvider{ + JsonMarshal: json.Marshal, + RandIntn: rand.Intn, + TimeNow: time.Now, + HttpListenAndServe: http.ListenAndServe, } func newOmikuji() *Omikuji { @@ -48,7 +52,7 @@ func Run(port int) error { o := newOmikuji() http.HandleFunc("/", o.omikujiHandler) fmt.Println("Server is starting with port " +strconv.Itoa(port), "👍") - err := http.ListenAndServe(":" + strconv.Itoa(port), nil) + err := StdMethods.HttpListenAndServe(":" + strconv.Itoa(port), nil) if err != nil { return errors.Wrapf(err, "Error in Run()\n") } @@ -57,7 +61,7 @@ func Run(port int) error { func (o *Omikuji)throwOneToSix() int { rand.Seed(o.DateTime.UnixNano()) - i := StdMethods.randIntn(6) + i := StdMethods.RandIntn(6) return i + 1 } @@ -78,7 +82,7 @@ func (o *Omikuji)intToStr(n int) (string, error) { func (o *Omikuji) tryOmikuji() error { var err error - o.DateTime = time.Now() + o.DateTime = StdMethods.TimeNow() if !o.isNewYearHoliday(){ o.Dice = o.throwOneToSix() } else { @@ -89,7 +93,7 @@ func (o *Omikuji) tryOmikuji() error { } func (o *Omikuji) genJson() ([]byte, error) { - js, err := StdMethods.jsonMarshal(o) + js, err := StdMethods.JsonMarshal(o) if err != nil { return nil, err } diff --git a/kadai4/segakazzz/omikuji/omikuji_test.go b/kadai4/segakazzz/omikuji/omikuji_test.go index 0349964..0d7f9b1 100644 --- a/kadai4/segakazzz/omikuji/omikuji_test.go +++ b/kadai4/segakazzz/omikuji/omikuji_test.go @@ -1,7 +1,11 @@ package omikuji_test import ( + "fmt" "github.com/gopherdojo/dojo8/kadai4/segakazzz/omikuji" + "io/ioutil" + "net/http" + "net/http/httptest" "reflect" "testing" "time" @@ -186,7 +190,6 @@ func TestOmikuji_isNewYearHoliday(t *testing.T) { }, want: true, }, - } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { @@ -202,34 +205,6 @@ func TestOmikuji_isNewYearHoliday(t *testing.T) { } } -//func TestOmikuji_omikujiHandler(t *testing.T) { -// type fields struct { -// DateTime time.Time -// Dice int -// Result string -// } -// type args struct { -// w http.ResponseWriter -// r *http.Request -// } -// tests := []struct { -// name string -// fields fields -// args args -// }{ -// // TODO: Add test cases. -// } -// for _, tt := range tests { -// t.Run(tt.name, func(t *testing.T) { -// o := &omikuji.Omikuji{ -// DateTime: tt.fields.DateTime, -// Dice: tt.fields.Dice, -// Result: tt.fields.Result, -// } -// }) -// } -//} - func TestOmikuji_throwOneToSix(t *testing.T) { type fields struct { DateTime time.Time @@ -242,9 +217,9 @@ func TestOmikuji_throwOneToSix(t *testing.T) { want int }{ { - name: "Success", + name: "Success", fields: fields{}, - want: 6, + want: 6, }, } for _, tt := range tests { @@ -262,67 +237,193 @@ func TestOmikuji_throwOneToSix(t *testing.T) { } } -func TestOmikuji_tryOmikuji(t *testing.T) { - type fields struct { - isNewYear bool - Dice int - Result string +func TestRun(t *testing.T) { + type args struct { + port int } tests := []struct { name string - fields fields + args args wantErr bool + mockMethod omikuji.StdLibProvider }{ - // TODO: Add test cases. + { + name: "Error", + args: args{port: 8000}, + wantErr: true, + mockMethod: omikuji.StdLibProvider{ + HttpListenAndServe: func(addr string, handler http.Handler) error { + return fmt.Errorf("Mock http.listen and serve error") + }, + }, + }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - omikuji.IsNewYearHoliday = func (o *omikuji.Omikuji) bool { - return true - } - omikuji.ThrowOneToSix = func (o *omikuji.Omikuji) int { - return 6 + omikuji.StdMethods = tt.mockMethod + if err := omikuji.Run(tt.args.port); (err != nil) != tt.wantErr { + t.Errorf("Run() error = %v, wantErr %v", err, tt.wantErr) } - o := &omikuji.Omikuji{} - if err := omikuji.TryOmikuji(o); (err != nil) != tt.wantErr { - t.Errorf("tryOmikuji() error = %v, wantErr %v", err, tt.wantErr) + }) + } +} + +func Test_newOmikuji(t *testing.T) { + tests := []struct { + name string + want *omikuji.Omikuji + }{ + { + name: "Success", + want: &omikuji.Omikuji{}, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + if got := omikuji.NewOmikuji(); !reflect.DeepEqual(got, tt.want) { + t.Errorf("newOmikuji() = %v, want %v", got, tt.want) } }) } } -func TestRun(t *testing.T) { - type args struct { - port int +func TestOmikuji_tryOmikuji(t *testing.T) { + type fields struct { + DateTime time.Time + Dice int + Result string } tests := []struct { - name string - args args - wantErr bool + name string + fields fields + wantErr bool + mockMethods omikuji.StdLibProvider }{ - // TODO: Add test cases. + { + name: "New Year Holiday", + fields: fields{}, + wantErr: false, + mockMethods: omikuji.MockHoliday, + }, + { + name: "Not New Year Holiday", + fields: fields{}, + wantErr: false, + mockMethods: omikuji.MockNotHoliday, + }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - if err := omikuji.Run(tt.args.port); (err != nil) != tt.wantErr { - t.Errorf("Run() error = %v, wantErr %v", err, tt.wantErr) + o := &omikuji.Omikuji{ + DateTime: tt.fields.DateTime, + Dice: tt.fields.Dice, + Result: tt.fields.Result, + } + omikuji.StdMethods = tt.mockMethods + if err := omikuji.TryOmikuji(o); (err != nil) != tt.wantErr { + t.Errorf("tryOmikuji() error = %v, wantErr %v", err, tt.wantErr) } }) } } -func Test_newOmikuji(t *testing.T) { +func TestOmikuji_omikujiHandler(t *testing.T) { + type fields struct { + DateTime time.Time + Dice int + Result string + } tests := []struct { - name string - want *omikuji.Omikuji + name string + fields fields + mockMethods omikuji.StdLibProvider + wantCode int + wantErr bool + wantResp string }{ - // TODO: Add test cases. + { + name: "Not New Year", + fields: fields{ + DateTime: time.Date(2020, time.July, 21, 5, 9, 23, 3424, time.UTC), + Dice: 6, + Result: "大吉", + }, + mockMethods: omikuji.StdLibProvider{ + JsonMarshal: omikuji.StdStdMethods.JsonMarshal, + RandIntn: omikuji.StdStdMethods.RandIntn, + TimeNow: func() time.Time{ + return time.Date(2020, time.July, 21, 5, 9, 23, 3424, time.UTC) + }, + }, + wantResp: "{\"time\":\"2020-07-21T05:09:23.000003424Z\",\"dice\":3,\"result\":\"吉\"}", + wantCode: http.StatusOK, + wantErr: false, + }, + { + name: "Try Omikuji Error", + fields: fields{ + DateTime: time.Date(2020, time.July, 21, 5, 9, 23, 3424, time.UTC), + Dice: 6, + Result: "大吉", + }, + mockMethods: omikuji.StdLibProvider{ + JsonMarshal: func(v interface{}) ([]byte, error) { + return nil, fmt.Errorf("json.marshal dummy error...") + }, + RandIntn: omikuji.StdStdMethods.RandIntn, + TimeNow: omikuji.StdStdMethods.TimeNow, + }, + wantCode: http.StatusInternalServerError, + wantErr: true, + wantResp: "", + }, + { + name: "Try Omikuji Error", + fields: fields{ + DateTime: time.Date(2020, time.July, 21, 5, 9, 23, 3424, time.UTC), + Dice: 6, + Result: "大吉", + }, + mockMethods: omikuji.StdLibProvider{ + JsonMarshal: omikuji.StdMethods.JsonMarshal, + RandIntn: func(n int) int{ + return 10 + }, + TimeNow: omikuji.StdStdMethods.TimeNow, + }, + wantCode: http.StatusInternalServerError, + wantErr: true, + wantResp: "", + }, + } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - if got := omikuji.NewOmikuji(); !reflect.DeepEqual(got, tt.want) { - t.Errorf("newOmikuji() = %v, want %v", got, tt.want) + o := &omikuji.Omikuji{ + DateTime: tt.fields.DateTime, + Dice: tt.fields.Dice, + Result: tt.fields.Result, + } + w := httptest.NewRecorder() + r := httptest.NewRequest("GET", "/", nil) + omikuji.StdMethods = tt.mockMethods + omikuji.OmikujiHandler(o, w, r) + rw := w.Result() + defer rw.Body.Close() + if rw.StatusCode != tt.wantCode { + t.Fatal("unexpected status code") + } + b, err := ioutil.ReadAll(rw.Body) + if err != nil { + t.Fatal("unexpected error") + } + if rw.StatusCode == http.StatusOK{ + expected := tt.wantResp + if s := string(b); s != expected { + t.Fatalf("unexpected response: %s", s) + } } }) } } + From 473ce9a4f8a629faccdd4c14ca8ea128a39d4af7 Mon Sep 17 00:00:00 2001 From: Kazue Sasatani Date: Wed, 29 Jul 2020 23:31:17 +0900 Subject: [PATCH 6/6] Added README.md --- kadai4/segakazzz/README.md | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/kadai4/segakazzz/README.md b/kadai4/segakazzz/README.md index 25f4f1d..efdb5f4 100644 --- a/kadai4/segakazzz/README.md +++ b/kadai4/segakazzz/README.md @@ -23,4 +23,17 @@ Server is running with port 8080👍 ### 処理説明補足 - 以前作成した[Try]おみくじプログラムを作ろうを応用しました。 +- テストパッケージをomikuji_testとして作成しました。(課題2は同じパッケージ内で行った) +- テストでは勉強のため、一部のテストをStandard Library提供の関数をMockして実行しました。 +~~~ +$ cd omikuji +$ go test --cover --coverprofile=coverprofile.out +Server is starting with port 8000 👍 +PASS +coverage: 97.6% of statements +ok github.com/gopherdojo/dojo8/kadai4/segakazzz/omikuji 0.016s +~~~ + +## 感想 +- APIの作成自体はすんなり終わりましたが、テストコードの作成にかなり苦戦しました \ No newline at end of file