Files
gochat/backend/internal/repository/working_hour_repo_test.go
T

155 lines
5.0 KiB
Go

package repository
import (
"context"
"testing"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
"github.com/gochat/gochat/internal/model"
)
func TestWorkingHourRepo_CreateDefaultWorkingHours(t *testing.T) {
db := setupTestDB(t, &model.WorkingHour{})
repo := NewWorkingHourRepo(db)
account := &model.Account{Name: "WHOrg", Locale: "en", Active: true}
require.NoError(t, db.Create(account).Error)
inbox := &model.Inbox{AccountID: account.ID, Name: "Inbox", ChannelType: "web_widget"}
require.NoError(t, db.Create(inbox).Error)
err := repo.CreateDefaultWorkingHours(context.Background(), inbox.ID, account.ID)
assert.NoError(t, err)
hours, err := repo.FindByInbox(context.Background(), inbox.ID)
assert.NoError(t, err)
assert.Len(t, hours, 7)
}
func TestWorkingHourRepo_FindByInbox(t *testing.T) {
db := setupTestDB(t, &model.WorkingHour{})
repo := NewWorkingHourRepo(db)
account := &model.Account{Name: "WHFindOrg", Locale: "en", Active: true}
require.NoError(t, db.Create(account).Error)
inbox := &model.Inbox{AccountID: account.ID, Name: "Inbox", ChannelType: "web_widget"}
require.NoError(t, db.Create(inbox).Error)
require.NoError(t, repo.CreateDefaultWorkingHours(context.Background(), inbox.ID, account.ID))
hours, err := repo.FindByInbox(context.Background(), inbox.ID)
assert.NoError(t, err)
assert.Len(t, hours, 7)
// Check ordering by day_of_week
for i := 1; i < len(hours); i++ {
assert.GreaterOrEqual(t, hours[i].DayOfWeek, hours[i-1].DayOfWeek)
}
}
func TestWorkingHourRepo_FindByInboxAndDay(t *testing.T) {
db := setupTestDB(t, &model.WorkingHour{})
repo := NewWorkingHourRepo(db)
account := &model.Account{Name: "WHDayOrg", Locale: "en", Active: true}
require.NoError(t, db.Create(account).Error)
inbox := &model.Inbox{AccountID: account.ID, Name: "Inbox", ChannelType: "web_widget"}
require.NoError(t, db.Create(inbox).Error)
require.NoError(t, repo.CreateDefaultWorkingHours(context.Background(), inbox.ID, account.ID))
wh, err := repo.FindByInboxAndDay(context.Background(), inbox.ID, 1)
assert.NoError(t, err)
assert.Equal(t, 1, wh.DayOfWeek)
assert.False(t, wh.ClosedAllDay)
}
func TestWorkingHourRepo_FindByInboxAndDay_NotFound(t *testing.T) {
db := setupTestDB(t, &model.WorkingHour{})
repo := NewWorkingHourRepo(db)
_, err := repo.FindByInboxAndDay(context.Background(), 9999, 1)
assert.Error(t, err)
}
func TestWorkingHourRepo_UpdateWorkingHours(t *testing.T) {
db := setupTestDB(t, &model.WorkingHour{})
repo := NewWorkingHourRepo(db)
account := &model.Account{Name: "WHUpdOrg", Locale: "en", Active: true}
require.NoError(t, db.Create(account).Error)
inbox := &model.Inbox{AccountID: account.ID, Name: "Inbox", ChannelType: "web_widget"}
require.NoError(t, db.Create(inbox).Error)
require.NoError(t, repo.CreateDefaultWorkingHours(context.Background(), inbox.ID, account.ID))
openHr := 10
closeHr := 18
zero := 0
params := []WorkingHourUpdateParam{
{DayOfWeek: 0, ClosedAllDay: true},
{DayOfWeek: 1, OpenAllDay: false, OpenHour: &openHr, OpenMinutes: &zero, CloseHour: &closeHr, CloseMinutes: &zero},
}
err := repo.UpdateWorkingHours(context.Background(), inbox.ID, params)
assert.NoError(t, err)
wh, err := repo.FindByInboxAndDay(context.Background(), inbox.ID, 1)
assert.NoError(t, err)
require.NotNil(t, wh.OpenHour)
assert.Equal(t, 10, *wh.OpenHour)
require.NotNil(t, wh.CloseHour)
assert.Equal(t, 18, *wh.CloseHour)
}
func TestWorkingHourRepo_UpdateWorkingHours_NotFound(t *testing.T) {
db := setupTestDB(t, &model.WorkingHour{})
repo := NewWorkingHourRepo(db)
openHr := 10
params := []WorkingHourUpdateParam{
{DayOfWeek: 0, OpenHour: &openHr},
}
err := repo.UpdateWorkingHours(context.Background(), 9999, params)
assert.Error(t, err)
}
func TestWorkingHourUpdateParam_UnmarshalJSON(t *testing.T) {
var p WorkingHourUpdateParam
err := p.UnmarshalJSON([]byte(`{"day_of_week":1,"closed_all_day":false,"open_all_day":true,"open_hour":"9","open_minutes":"0","close_hour":"17","close_minutes":"0"}`))
assert.NoError(t, err)
assert.Equal(t, 1, p.DayOfWeek)
assert.True(t, p.OpenAllDay)
require.NotNil(t, p.OpenHour)
assert.Equal(t, 9, *p.OpenHour)
}
func TestWorkingHourUpdateParam_UnmarshalJSON_Empty(t *testing.T) {
var p WorkingHourUpdateParam
err := p.UnmarshalJSON([]byte(`{"day_of_week":"null","open_hour":"","close_hour":"null"}`))
assert.NoError(t, err)
assert.Equal(t, 0, p.DayOfWeek)
assert.Nil(t, p.OpenHour)
assert.Nil(t, p.CloseHour)
}
func TestWorkingHourUpdateParam_UnmarshalJSON_Invalid(t *testing.T) {
var p WorkingHourUpdateParam
err := p.UnmarshalJSON([]byte(`invalid json`))
assert.Error(t, err)
}
func TestIntFromAny(t *testing.T) {
assert.Equal(t, 5, intFromAny(float64(5)))
assert.Equal(t, 0, intFromAny(nil))
assert.Equal(t, 0, intFromAny("abc"))
assert.Equal(t, 42, intFromAny("42"))
}
func TestBoolFromAny(t *testing.T) {
assert.True(t, boolFromAny(true))
assert.False(t, boolFromAny(false))
assert.True(t, boolFromAny("true"))
assert.False(t, boolFromAny("false"))
assert.False(t, boolFromAny(nil))
assert.False(t, boolFromAny(123))
}