init push
This commit is contained in:
233
internal/service/hospital_service_test.go
Normal file
233
internal/service/hospital_service_test.go
Normal file
@@ -0,0 +1,233 @@
|
||||
package service
|
||||
|
||||
import (
|
||||
"context"
|
||||
"errors"
|
||||
"testing"
|
||||
|
||||
"wucher/internal/domain/hospital"
|
||||
)
|
||||
|
||||
type hospitalRepoMock struct {
|
||||
createCalled bool
|
||||
updateCalled bool
|
||||
deleteCalled bool
|
||||
getByIDCalled bool
|
||||
listCalled bool
|
||||
|
||||
lastCreate *hospital.Hospital
|
||||
lastUpdate *hospital.Hospital
|
||||
lastDeleteID []byte
|
||||
lastDeleteBy []byte
|
||||
lastGetByID []byte
|
||||
lastListFilter string
|
||||
lastListSort string
|
||||
lastListLimit int
|
||||
lastListOffset int
|
||||
|
||||
getByIDResult *hospital.Hospital
|
||||
listResult []hospital.Hospital
|
||||
listTotal int64
|
||||
|
||||
createErr error
|
||||
updateErr error
|
||||
deleteErr error
|
||||
getByIDErr error
|
||||
listErr error
|
||||
}
|
||||
|
||||
func (m *hospitalRepoMock) Create(_ context.Context, row *hospital.Hospital) error {
|
||||
m.createCalled = true
|
||||
m.lastCreate = row
|
||||
return m.createErr
|
||||
}
|
||||
|
||||
func (m *hospitalRepoMock) Update(_ context.Context, row *hospital.Hospital) error {
|
||||
m.updateCalled = true
|
||||
m.lastUpdate = row
|
||||
return m.updateErr
|
||||
}
|
||||
|
||||
func (m *hospitalRepoMock) Delete(_ context.Context, id []byte, deletedBy []byte) error {
|
||||
m.deleteCalled = true
|
||||
m.lastDeleteID = id
|
||||
m.lastDeleteBy = deletedBy
|
||||
return m.deleteErr
|
||||
}
|
||||
|
||||
func (m *hospitalRepoMock) GetByID(_ context.Context, id []byte) (*hospital.Hospital, error) {
|
||||
m.getByIDCalled = true
|
||||
m.lastGetByID = id
|
||||
return m.getByIDResult, m.getByIDErr
|
||||
}
|
||||
|
||||
func (m *hospitalRepoMock) List(_ context.Context, filter, sort string, limit, offset int) ([]hospital.Hospital, int64, error) {
|
||||
m.listCalled = true
|
||||
m.lastListFilter = filter
|
||||
m.lastListSort = sort
|
||||
m.lastListLimit = limit
|
||||
m.lastListOffset = offset
|
||||
return m.listResult, m.listTotal, m.listErr
|
||||
}
|
||||
|
||||
func TestNewHospitalService(t *testing.T) {
|
||||
repo := &hospitalRepoMock{}
|
||||
svc := NewHospitalService(repo)
|
||||
if svc == nil || svc.repo == nil {
|
||||
t.Fatalf("expected service and repo initialized")
|
||||
}
|
||||
}
|
||||
|
||||
func TestHospitalServiceCreate(t *testing.T) {
|
||||
repo := &hospitalRepoMock{}
|
||||
svc := NewHospitalService(repo)
|
||||
row := &hospital.Hospital{Name: "RSUD Kota", Address: "Jl. Merdeka"}
|
||||
|
||||
if err := svc.Create(context.Background(), row); err != nil {
|
||||
t.Fatalf("unexpected error: %v", err)
|
||||
}
|
||||
if !repo.createCalled || repo.lastCreate != row {
|
||||
t.Fatalf("expected Create forwarded to repo")
|
||||
}
|
||||
|
||||
repo.createErr = errors.New("create failed")
|
||||
if err := svc.Create(context.Background(), row); err == nil {
|
||||
t.Fatalf("expected error from repo")
|
||||
}
|
||||
}
|
||||
|
||||
func TestHospitalServiceUpdate(t *testing.T) {
|
||||
repo := &hospitalRepoMock{}
|
||||
svc := NewHospitalService(repo)
|
||||
row := &hospital.Hospital{Name: "RSUD Kota", Address: "Jl. Baru"}
|
||||
|
||||
if err := svc.Update(context.Background(), row); err != nil {
|
||||
t.Fatalf("unexpected error: %v", err)
|
||||
}
|
||||
if !repo.updateCalled || repo.lastUpdate != row {
|
||||
t.Fatalf("expected Update forwarded to repo")
|
||||
}
|
||||
|
||||
repo.updateErr = errors.New("update failed")
|
||||
if err := svc.Update(context.Background(), row); err == nil {
|
||||
t.Fatalf("expected error from repo")
|
||||
}
|
||||
}
|
||||
|
||||
func TestHospitalServiceDelete(t *testing.T) {
|
||||
repo := &hospitalRepoMock{}
|
||||
svc := NewHospitalService(repo)
|
||||
id := []byte("id")
|
||||
deletedBy := []byte("by")
|
||||
|
||||
if err := svc.Delete(context.Background(), id, deletedBy); err != nil {
|
||||
t.Fatalf("unexpected error: %v", err)
|
||||
}
|
||||
if !repo.deleteCalled {
|
||||
t.Fatalf("expected Delete forwarded to repo")
|
||||
}
|
||||
if string(repo.lastDeleteID) != string(id) || string(repo.lastDeleteBy) != string(deletedBy) {
|
||||
t.Fatalf("expected delete params forwarded")
|
||||
}
|
||||
|
||||
repo.deleteErr = errors.New("delete failed")
|
||||
if err := svc.Delete(context.Background(), id, deletedBy); err == nil {
|
||||
t.Fatalf("expected error from repo")
|
||||
}
|
||||
}
|
||||
|
||||
func TestHospitalServiceGetByID(t *testing.T) {
|
||||
expected := &hospital.Hospital{Name: "RSUD Kota", Address: "Jl. Merdeka"}
|
||||
repo := &hospitalRepoMock{getByIDResult: expected}
|
||||
svc := NewHospitalService(repo)
|
||||
id := []byte("id")
|
||||
|
||||
got, err := svc.GetByID(context.Background(), id)
|
||||
if err != nil {
|
||||
t.Fatalf("unexpected error: %v", err)
|
||||
}
|
||||
if got != expected {
|
||||
t.Fatalf("unexpected result")
|
||||
}
|
||||
if !repo.getByIDCalled || string(repo.lastGetByID) != string(id) {
|
||||
t.Fatalf("expected GetByID forwarded")
|
||||
}
|
||||
|
||||
repo.getByIDErr = errors.New("get failed")
|
||||
if _, err := svc.GetByID(context.Background(), id); err == nil {
|
||||
t.Fatalf("expected error from repo")
|
||||
}
|
||||
}
|
||||
|
||||
func TestHospitalServiceList(t *testing.T) {
|
||||
repo := &hospitalRepoMock{
|
||||
listResult: []hospital.Hospital{{Name: "RSUD Kota", Address: "Jl. Merdeka"}},
|
||||
listTotal: 1,
|
||||
}
|
||||
svc := NewHospitalService(repo)
|
||||
|
||||
rows, total, err := svc.List(context.Background(), "find", "name", 10, 20)
|
||||
if err != nil {
|
||||
t.Fatalf("unexpected error: %v", err)
|
||||
}
|
||||
if len(rows) != 1 || total != 1 {
|
||||
t.Fatalf("unexpected list result")
|
||||
}
|
||||
if !repo.listCalled {
|
||||
t.Fatalf("expected List forwarded to repo")
|
||||
}
|
||||
if repo.lastListFilter != "find" || repo.lastListSort != "hospital_name ASC" || repo.lastListLimit != 10 || repo.lastListOffset != 20 {
|
||||
t.Fatalf("unexpected list args forwarded")
|
||||
}
|
||||
|
||||
rows, total, err = svc.List(context.Background(), "find", "sortkey", 10, 20)
|
||||
if err != nil {
|
||||
t.Fatalf("unexpected error: %v", err)
|
||||
}
|
||||
if len(rows) != 1 || total != 1 {
|
||||
t.Fatalf("unexpected list result")
|
||||
}
|
||||
if repo.lastListSort != "is_active DESC, CASE WHEN is_active = 1 AND sortkey IS NOT NULL AND sortkey >= 0 THEN 0 ELSE 1 END ASC, CASE WHEN is_active = 1 AND sortkey IS NOT NULL AND sortkey >= 0 THEN sortkey END ASC, hospital_name ASC" {
|
||||
t.Fatalf("unexpected sortkey args forwarded: %q", repo.lastListSort)
|
||||
}
|
||||
|
||||
repo.listErr = errors.New("list failed")
|
||||
if _, _, err := svc.List(context.Background(), "", "unknown", 1, 0); err == nil {
|
||||
t.Fatalf("expected error from repo")
|
||||
}
|
||||
}
|
||||
|
||||
func TestNormalizeHospitalSort(t *testing.T) {
|
||||
cases := map[string]string{
|
||||
"name": "hospital_name ASC",
|
||||
"-name": "hospital_name DESC",
|
||||
"hospital_name": "hospital_name ASC",
|
||||
"-hospital_name": "hospital_name DESC",
|
||||
"sortkey": "is_active DESC, CASE WHEN is_active = 1 AND sortkey IS NOT NULL AND sortkey >= 0 THEN 0 ELSE 1 END ASC, CASE WHEN is_active = 1 AND sortkey IS NOT NULL AND sortkey >= 0 THEN sortkey END ASC, hospital_name ASC",
|
||||
"-sortkey": "is_active DESC, CASE WHEN is_active = 1 AND sortkey IS NOT NULL AND sortkey >= 0 THEN 0 ELSE 1 END ASC, CASE WHEN is_active = 1 AND sortkey IS NOT NULL AND sortkey >= 0 THEN sortkey END DESC, hospital_name ASC",
|
||||
"address": "address ASC",
|
||||
"-address": "address DESC",
|
||||
"landline_number": "landline_number ASC",
|
||||
"-landline_number": "landline_number DESC",
|
||||
"mobile_number": "mobile_number ASC",
|
||||
"-mobile_number": "mobile_number DESC",
|
||||
"email": "email ASC",
|
||||
"-email": "email DESC",
|
||||
"note": "note ASC",
|
||||
"-note": "note DESC",
|
||||
"is_active": "is_active ASC",
|
||||
"-is_active": "is_active DESC",
|
||||
"created_at": "created_at ASC",
|
||||
"-created_at": "created_at DESC",
|
||||
"updated_at": "updated_at ASC",
|
||||
"-updated_at": "updated_at DESC",
|
||||
"unknown": "",
|
||||
"": "",
|
||||
}
|
||||
|
||||
for in, want := range cases {
|
||||
if got := normalizeHospitalSort(in); got != want {
|
||||
t.Fatalf("normalizeHospitalSort(%q) = %q, want %q", in, got, want)
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user