order_test.go 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168
  1. package service
  2. import (
  3. "testing"
  4. "time"
  5. "job-cheng-xing/model"
  6. "job-cheng-xing/repository"
  7. )
  8. func TestCreateOrder(t *testing.T) {
  9. repo := repository.NewMemoryRepo()
  10. svc := NewOrderService(repo)
  11. req := model.CreateOrderRequest{
  12. ServiceTime: time.Now().Add(24 * time.Hour),
  13. Duration: 120,
  14. Address: "北京朝阳区xxx路xxx号",
  15. }
  16. order, err := svc.CreateOrder(req)
  17. if err != nil {
  18. t.Fatalf("CreateOrder failed: %v", err)
  19. }
  20. if order.ID == "" {
  21. t.Error("expected non-empty ID")
  22. }
  23. if order.Status != model.StatusPending {
  24. t.Errorf("expected pending, got %s", order.Status)
  25. }
  26. if order.ProviderID != nil {
  27. t.Error("expected nil ProviderID")
  28. }
  29. }
  30. func TestAcceptOrder_Success(t *testing.T) {
  31. repo := repository.NewMemoryRepo()
  32. svc := NewOrderService(repo)
  33. order, _ := svc.CreateOrder(model.CreateOrderRequest{
  34. ServiceTime: time.Now().Add(24 * time.Hour),
  35. Duration: 120,
  36. Address: "北京朝阳",
  37. })
  38. result, err := svc.AcceptOrder(order.ID, "prov_001")
  39. if err != nil {
  40. t.Fatalf("AcceptOrder failed: %v", err)
  41. }
  42. if result.Status != model.StatusAccepted {
  43. t.Errorf("expected accepted, got %s", result.Status)
  44. }
  45. if *result.ProviderID != "prov_001" {
  46. t.Errorf("expected prov_001, got %s", *result.ProviderID)
  47. }
  48. }
  49. func TestAcceptOrder_AlreadyAccepted(t *testing.T) {
  50. repo := repository.NewMemoryRepo()
  51. svc := NewOrderService(repo)
  52. order, _ := svc.CreateOrder(model.CreateOrderRequest{
  53. ServiceTime: time.Now().Add(24 * time.Hour),
  54. Duration: 120,
  55. Address: "北京朝阳",
  56. })
  57. svc.AcceptOrder(order.ID, "prov_001")
  58. _, err := svc.AcceptOrder(order.ID, "prov_002")
  59. if err == nil {
  60. t.Fatal("expected error")
  61. }
  62. appErr, ok := err.(*model.AppError)
  63. if !ok || appErr.Code != "conflict" {
  64. t.Errorf("expected conflict error, got %v", err)
  65. }
  66. }
  67. func TestAcceptOrder_OrderNotFound(t *testing.T) {
  68. repo := repository.NewMemoryRepo()
  69. svc := NewOrderService(repo)
  70. _, err := svc.AcceptOrder("nonexistent", "prov_001")
  71. if err != model.ErrNotFound {
  72. t.Errorf("expected ErrNotFound, got %v", err)
  73. }
  74. }
  75. func TestCancelOrder_FromPending(t *testing.T) {
  76. repo := repository.NewMemoryRepo()
  77. svc := NewOrderService(repo)
  78. order, _ := svc.CreateOrder(model.CreateOrderRequest{
  79. ServiceTime: time.Now().Add(24 * time.Hour),
  80. Duration: 120,
  81. Address: "北京朝阳",
  82. })
  83. result, err := svc.CancelOrder(order.ID)
  84. if err != nil {
  85. t.Fatalf("CancelOrder failed: %v", err)
  86. }
  87. if result.Status != model.StatusCanceled {
  88. t.Errorf("expected canceled, got %s", result.Status)
  89. }
  90. }
  91. func TestCancelOrder_FromAccepted(t *testing.T) {
  92. repo := repository.NewMemoryRepo()
  93. svc := NewOrderService(repo)
  94. order, _ := svc.CreateOrder(model.CreateOrderRequest{
  95. ServiceTime: time.Now().Add(24 * time.Hour),
  96. Duration: 120,
  97. Address: "北京朝阳",
  98. })
  99. svc.AcceptOrder(order.ID, "prov_001")
  100. result, err := svc.CancelOrder(order.ID)
  101. if err != nil {
  102. t.Fatalf("CancelOrder failed: %v", err)
  103. }
  104. if result.Status != model.StatusCanceled {
  105. t.Errorf("expected canceled, got %s", result.Status)
  106. }
  107. }
  108. func TestCancelOrder_AlreadyCanceled(t *testing.T) {
  109. repo := repository.NewMemoryRepo()
  110. svc := NewOrderService(repo)
  111. order, _ := svc.CreateOrder(model.CreateOrderRequest{
  112. ServiceTime: time.Now().Add(24 * time.Hour),
  113. Duration: 120,
  114. Address: "北京朝阳",
  115. })
  116. svc.CancelOrder(order.ID)
  117. _, err := svc.CancelOrder(order.ID)
  118. if err == nil {
  119. t.Fatal("expected error")
  120. }
  121. appErr, ok := err.(*model.AppError)
  122. if !ok || appErr.Code != "invalid_state" {
  123. t.Errorf("expected invalid_state error, got %v", err)
  124. }
  125. }
  126. func TestAcceptOrder_AfterCanceled(t *testing.T) {
  127. repo := repository.NewMemoryRepo()
  128. svc := NewOrderService(repo)
  129. order, _ := svc.CreateOrder(model.CreateOrderRequest{
  130. ServiceTime: time.Now().Add(24 * time.Hour),
  131. Duration: 120,
  132. Address: "北京朝阳",
  133. })
  134. svc.CancelOrder(order.ID)
  135. _, err := svc.AcceptOrder(order.ID, "prov_001")
  136. if err == nil {
  137. t.Fatal("expected error")
  138. }
  139. appErr, ok := err.(*model.AppError)
  140. if !ok || appErr.Code != "invalid_state" {
  141. t.Errorf("expected invalid_state error, got %v", err)
  142. }
  143. }