...
1 package main
2
3 import (
4 "fmt"
5 "testing"
6
7 "github.com/DATA-DOG/go-sqlmock"
8 )
9
10
11 func TestShouldNotCancelOrderWithNonPendingStatus(t *testing.T) {
12
13 db, mock, err := sqlmock.New()
14 if err != nil {
15 t.Errorf("An error '%s' was not expected when opening a stub database connection", err)
16 }
17 defer db.Close()
18
19
20 columns := []string{"o_id", "o_status"}
21
22 mock.ExpectBegin()
23
24 mock.ExpectQuery("SELECT (.+) FROM orders AS o INNER JOIN users AS u (.+) FOR UPDATE").
25 WithArgs(1).
26 WillReturnRows(sqlmock.NewRows(columns).FromCSVString("1,1"))
27
28 mock.ExpectRollback()
29
30
31 err = cancelOrder(1, db)
32 if err != nil {
33 t.Errorf("Expected no error, but got %s instead", err)
34 }
35
36 if err := mock.ExpectationsWereMet(); err != nil {
37 t.Errorf("there were unfulfilled expectations: %s", err)
38 }
39 }
40
41
42 func TestShouldRefundUserWhenOrderIsCancelled(t *testing.T) {
43
44 db, mock, err := sqlmock.New()
45 if err != nil {
46 t.Errorf("An error '%s' was not expected when opening a stub database connection", err)
47 }
48 defer db.Close()
49
50
51 columns := []string{"o_id", "o_status", "o_value", "o_reserved_fee", "u_id", "u_balance"}
52
53 mock.ExpectBegin()
54
55 mock.ExpectQuery("SELECT (.+) FROM orders AS o INNER JOIN users AS u (.+) FOR UPDATE").
56 WithArgs(1).
57 WillReturnRows(sqlmock.NewRows(columns).AddRow(1, 0, 25.75, 3.25, 2, 10.00))
58
59 mock.ExpectPrepare("UPDATE users SET balance").ExpectExec().
60 WithArgs(25.75+3.25, 2).
61 WillReturnResult(sqlmock.NewResult(0, 1))
62
63 mock.ExpectPrepare("UPDATE orders SET status").ExpectExec().
64 WithArgs(ORDER_CANCELLED, 1).
65 WillReturnResult(sqlmock.NewResult(0, 1))
66
67 mock.ExpectCommit()
68
69
70 err = cancelOrder(1, db)
71 if err != nil {
72 t.Errorf("Expected no error, but got %s instead", err)
73 }
74
75 if err := mock.ExpectationsWereMet(); err != nil {
76 t.Errorf("there were unfulfilled expectations: %s", err)
77 }
78 }
79
80
81 func TestShouldRollbackOnError(t *testing.T) {
82
83 db, mock, err := sqlmock.New()
84 if err != nil {
85 t.Errorf("An error '%s' was not expected when opening a stub database connection", err)
86 }
87 defer db.Close()
88
89
90 mock.ExpectBegin()
91
92 mock.ExpectQuery("SELECT (.+) FROM orders AS o INNER JOIN users AS u (.+) FOR UPDATE").
93 WithArgs(1).
94 WillReturnError(fmt.Errorf("Some error"))
95
96 mock.ExpectRollback()
97
98
99 err = cancelOrder(1, db)
100
101 if err == nil {
102 t.Error("Expected error, but got none")
103 }
104
105 if err := mock.ExpectationsWereMet(); err != nil {
106 t.Errorf("there were unfulfilled expectations: %s", err)
107 }
108 }
109
View as plain text