package mapping import ( "encoding/json" "reflect" "testing" "time" "github.com/moustachioed/dash/backend/dashapi" "github.com/moustachioed/dash/backend/database/models" "gorm.io/datatypes" ) func TestJournalApiToDbFullObject(t *testing.T) { mapper := NewMapperImpl() api := dashapi.JournalEntry{ Date: "2022-02-18", Thankful: []string{"ttest1", "ttest2", "ttest3"}, LookingForward: []string{"lftest1", "lftest2", "lftest3"}, BeenGreat: []string{"bgtest1", "bgtest2", "bgtest3"}, DoBetter: []string{"dbtest1", "dbtest2", "dbtest3"}, Journal: "jtest", } db := mapper.JournalApiToDs(api).(models.Journal) gotDate, _ := db.Date.Value() got := gotDate.(time.Time).Format("2006-01-02") wantDate := api.Date if got != wantDate { t.Errorf("Mapped string %s not equal want string %s", got, wantDate) } got = db.Thankful.String() want, _ := json.Marshal(api.Thankful) if got != string(want) { t.Errorf("Mapped string %s not equal want string %s", got, want) } got = db.LookingForward.String() want, _ = json.Marshal(api.LookingForward) if got != string(want) { t.Errorf("Mapped string %s not equal want string %s", got, want) } got = db.BeenGreat.String() want, _ = json.Marshal(api.BeenGreat) if got != string(want) { t.Errorf("Mapped string %s not equal want string %s", got, want) } got = db.DoBetter.String() want, _ = json.Marshal(api.DoBetter) if got != string(want) { t.Errorf("Mapped string %s not equal want string %s", got, want) } got = db.Journal wantstring := api.Journal if got != string(wantstring) { t.Errorf("Mapped string %s not equal want string %s", got, wantstring) } } func TestJournalApiToDbPartialObject(t *testing.T) { mapper := NewMapperImpl() api := dashapi.JournalEntry{ Date: "2022-02-18", Thankful: nil, LookingForward: []string{"lftest1", "lftest2", "lftest3"}, BeenGreat: nil, DoBetter: []string{"dbtest1", "dbtest2", "dbtest3"}, Journal: "", } db := mapper.JournalApiToDs(api).(models.Journal) gotDate, _ := db.Date.Value() got := gotDate.(time.Time).Format("2006-01-02") wantDate := api.Date if got != wantDate { t.Errorf("Mapped string %s not equal want string %s", got, wantDate) } got = db.Thankful.String() want, _ := json.Marshal(api.Thankful) if got != string(want) { t.Errorf("Mapped string %s not equal want string %s", got, want) } got = db.LookingForward.String() want, _ = json.Marshal(api.LookingForward) if got != string(want) { t.Errorf("Mapped string %s not equal want string %s", got, want) } got = db.BeenGreat.String() want, _ = json.Marshal(api.BeenGreat) if got != string(want) { t.Errorf("Mapped string %s not equal want string %s", got, want) } got = db.DoBetter.String() want, _ = json.Marshal(api.DoBetter) if got != string(want) { t.Errorf("Mapped string %s not equal want string %s", got, want) } got = db.Journal wantstring := api.Journal if got != string(wantstring) { t.Errorf("Mapped string %s not equal want string %s", got, wantstring) } } func TestJournalDbToApiFullObject(t *testing.T) { mapper := NewMapperImpl() date, _ := time.Parse("2006-01-02", "2022-02-18") thankful, _ := json.Marshal([]string{"ttest1", "ttest2", "ttest3"}) lookingForward, _ := json.Marshal([]string{"lftest1", "lftest2", "lftest3"}) beenGreat, _ := json.Marshal([]string{"bgtest1", "bgtest2", "bgtest3"}) doBetter, _ := json.Marshal([]string{"dbtest1", "dbtest2", "test3"}) journal := "jtest" db := models.Journal{ Date: datatypes.Date(date), Thankful: datatypes.JSON(thankful), LookingForward: datatypes.JSON(lookingForward), BeenGreat: datatypes.JSON(beenGreat), DoBetter: datatypes.JSON(doBetter), Journal: journal, } api := mapper.JournalDsToApi(db).(dashapi.JournalEntry) got, _ := json.Marshal(api.Date) wantDate := "\"2022-02-18\"" if string(got) != wantDate { t.Errorf("Mapped string %s not equal want string %s", got, wantDate) } got, _ = json.Marshal(api.Thankful) want := thankful if string(got) != string(want) { t.Errorf("Mapped string %s not equal want string %s", got, want) } got, _ = json.Marshal(api.LookingForward) want = lookingForward if string(got) != string(want) { t.Errorf("Mapped string %s not equal want string %s", got, want) } got, _ = json.Marshal(api.BeenGreat) want = beenGreat if string(got) != string(want) { t.Errorf("Mapped string %s not equal want string %s", got, want) } got, _ = json.Marshal(api.DoBetter) want = doBetter if string(got) != string(want) { t.Errorf("Mapped string %s not equal want string %s", got, want) } gotJournal := api.Journal wantJournal := journal if gotJournal != wantJournal { t.Errorf("Mapped string %s not equal want string %s", gotJournal, wantJournal) } } func TestJournalDbToApiPartialObject(t *testing.T) { mapper := NewMapperImpl() date, _ := time.Parse("2006-01-02", "2022-02-18") var thankful []byte = nil lookingForward, _ := json.Marshal([]string{"lftest1", "lftest2", "lftest3"}) var beenGreat []byte = nil doBetter, _ := json.Marshal([]string{"dbtest1", "dbtest2", "test3"}) journal := "jtest" db := models.Journal{ Date: datatypes.Date(date), Thankful: datatypes.JSON(thankful), LookingForward: datatypes.JSON(lookingForward), BeenGreat: datatypes.JSON(beenGreat), DoBetter: datatypes.JSON(doBetter), Journal: journal, } api := mapper.JournalDsToApi(db).(dashapi.JournalEntry) got, _ := json.Marshal(api.Date) wantDate := "\"2022-02-18\"" if string(got) != wantDate { t.Errorf("Mapped string %s not equal want string %s", got, wantDate) } got, _ = json.Marshal(api.Thankful) wantString := "null" if string(got) != wantString { t.Errorf("Mapped string %s not equal want string %s", got, wantString) } got, _ = json.Marshal(api.LookingForward) want := lookingForward if string(got) != string(want) { t.Errorf("Mapped string %s not equal want string %s", got, want) } got, _ = json.Marshal(api.BeenGreat) wantString = "null" if string(got) != wantString { t.Errorf("Mapped string %s not equal want string %s", got, wantString) } got, _ = json.Marshal(api.DoBetter) want = doBetter if string(got) != string(want) { t.Errorf("Mapped string %s not equal want string %s", got, want) } gotJournal := api.Journal wantJournal := journal if gotJournal != wantJournal { t.Errorf("Mapped string %s not equal want string %s", gotJournal, wantJournal) } } func TestMapperImpl_PlanDayApiToDs(t *testing.T) { date, _ := time.Parse("2006-01-02", "2022-02-18") morning, _ := json.Marshal([]string{"motest1", "motest2", "motest3"}) midday, _ := json.Marshal([]string{"mitest1", "mitest2", "mitest3"}) afternoon, _ := json.Marshal([]string{"antest1", "antest2", "antest3"}) evening, _ := json.Marshal([]string{"etest1", "etest2", "etest3"}) pleasant, _ := json.Marshal([]string{"ptest1", "ptest2", "ptest3"}) reminders, _ := json.Marshal([]string{"rtest1", "rtest2", "rtest3"}) empty, _ := json.Marshal(nil) type args struct { am interface{} } tests := []struct { name string mapper MapperImpl args args want interface{} }{ { name: "Full Object", mapper: MapperImpl{}, args: args{ am: dashapi.PlanDay{ Date: "2022-02-18", Morning: []string{"motest1", "motest2", "motest3"}, Midday: []string{"mitest1", "mitest2", "mitest3"}, Afternoon: []string{"antest1", "antest2", "antest3"}, Evening: []string{"etest1", "etest2", "etest3"}, Pleasant: []string{"ptest1", "ptest2", "ptest3"}, Reminders: []string{"rtest1", "rtest2", "rtest3"}, }}, want: models.PlanDay{ Date: datatypes.Date(date), Morning: datatypes.JSON(morning), Midday: datatypes.JSON(midday), Afternoon: datatypes.JSON(afternoon), Evening: datatypes.JSON(evening), Pleasant: datatypes.JSON(pleasant), Reminders: datatypes.JSON(reminders), }, }, { name: "Partial Object", mapper: MapperImpl{}, args: args{ am: dashapi.PlanDay{ Date: "2022-02-18", Morning: []string{"motest1", "motest2", "motest3"}, Midday: nil, Afternoon: nil, Evening: nil, Pleasant: []string{"ptest1", "ptest2", "ptest3"}, Reminders: nil, }}, want: models.PlanDay{ Date: datatypes.Date(date), Morning: datatypes.JSON(morning), Midday: datatypes.JSON(empty), Afternoon: datatypes.JSON(empty), Evening: datatypes.JSON(empty), Pleasant: datatypes.JSON(pleasant), Reminders: datatypes.JSON(empty), }, }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { mapper := MapperImpl{} if got := mapper.PlanDayApiToDs(tt.args.am); !reflect.DeepEqual(got, tt.want) { t.Errorf("MapperImpl.PlanDayApiToDs() = %v, want %v", got, tt.want) } }) } } func TestMapperImpl_PlanDayDsToApi(t *testing.T) { date, _ := time.Parse("2006-01-02", "2022-02-18") morning, _ := json.Marshal([]string{"motest1", "motest2", "motest3"}) midday, _ := json.Marshal([]string{"mitest1", "mitest2", "mitest3"}) afternoon, _ := json.Marshal([]string{"antest1", "antest2", "antest3"}) evening, _ := json.Marshal([]string{"etest1", "etest2", "etest3"}) pleasant, _ := json.Marshal([]string{"ptest1", "ptest2", "ptest3"}) reminders, _ := json.Marshal([]string{"rtest1", "rtest2", "rtest3"}) empty, _ := json.Marshal(nil) type args struct { dm interface{} } tests := []struct { name string mapper MapperImpl args args want interface{} }{ { name: "Full Object", mapper: MapperImpl{}, args: args{ dm: models.PlanDay{ Date: datatypes.Date(date), Morning: datatypes.JSON(morning), Midday: datatypes.JSON(midday), Afternoon: datatypes.JSON(afternoon), Evening: datatypes.JSON(evening), Pleasant: datatypes.JSON(pleasant), Reminders: datatypes.JSON(reminders), }}, want: dashapi.PlanDay{ Date: "2022-02-18", Morning: []string{"motest1", "motest2", "motest3"}, Midday: []string{"mitest1", "mitest2", "mitest3"}, Afternoon: []string{"antest1", "antest2", "antest3"}, Evening: []string{"etest1", "etest2", "etest3"}, Pleasant: []string{"ptest1", "ptest2", "ptest3"}, Reminders: []string{"rtest1", "rtest2", "rtest3"}, }, }, { name: "Partial Object", mapper: MapperImpl{}, args: args{ dm: models.PlanDay{ Date: datatypes.Date(date), Morning: datatypes.JSON(morning), Midday: datatypes.JSON(empty), Afternoon: datatypes.JSON(afternoon), Evening: datatypes.JSON(empty), Pleasant: datatypes.JSON(pleasant), Reminders: datatypes.JSON(empty), }}, want: dashapi.PlanDay{ Date: "2022-02-18", Morning: []string{"motest1", "motest2", "motest3"}, Midday: nil, Afternoon: []string{"antest1", "antest2", "antest3"}, Evening: nil, Pleasant: []string{"ptest1", "ptest2", "ptest3"}, Reminders: nil, }, }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { mapper := MapperImpl{} if got := mapper.PlanDayDsToApi(tt.args.dm); !reflect.DeepEqual(got, tt.want) { t.Errorf("MapperImpl.PlanDayDsToApi() = %v, want %v", got, tt.want) } }) } } func TestMapperImpl_StringToDate(t *testing.T) { type args struct { dateString string } tests := []struct { name string mapper MapperImpl args args want time.Time wantErr bool }{ { name: "Well-formed date", mapper: MapperImpl{}, args: args{ dateString: "1987-02-18", }, want: time.Date(1987, 2, 18, 0, 0, 0, 0, time.UTC), wantErr: false, }, { name: "False string", mapper: MapperImpl{}, args: args{ dateString: "1987-02-18'T'13:02:18", }, want: time.Date(1970, 1, 1, 0, 0, 0, 0, time.UTC), wantErr: true, }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { mapper := MapperImpl{} got, err := mapper.StringToDate(tt.args.dateString) if (err != nil) != tt.wantErr { t.Errorf("MapperImpl.StringToDate() error = %v, wantErr %v", err, tt.wantErr) return } if !reflect.DeepEqual(got, tt.want) { t.Errorf("MapperImpl.StringToDate() = %v, want %v", got, tt.want) } }) } } func TestMapperImpl_DateToString(t *testing.T) { type args struct { date time.Time } tests := []struct { name string mapper MapperImpl args args want string }{ { name: "Well-formed date", mapper: MapperImpl{}, args: args{ date: time.Date(1987, 2, 18, 0, 0, 0, 0, time.UTC), }, want: "1987-02-18", }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { mapper := MapperImpl{} if got := mapper.DateToString(tt.args.date); got != tt.want { t.Errorf("MapperImpl.DateToString() = %v, want %v", got, tt.want) } }) } }