moira
231 строка · 8.4 Кб
1package controller
2
3import (
4"fmt"
5"testing"
6
7"github.com/golang/mock/gomock"
8"github.com/satori/go.uuid"
9. "github.com/smartystreets/goconvey/convey"
10
11"go.avito.ru/DO/moira"
12"go.avito.ru/DO/moira/api"
13"go.avito.ru/DO/moira/api/dto"
14"go.avito.ru/DO/moira/database"
15"go.avito.ru/DO/moira/mock/moira-alert"
16)
17
18func TestGetUserSubscriptions(t *testing.T) {
19mockCtrl := gomock.NewController(t)
20defer mockCtrl.Finish()
21database := mock_moira_alert.NewMockDatabase(mockCtrl)
22login := "user"
23
24Convey("Two subscriptions", t, func() {
25subscriptionIDs := []string{uuid.NewV4().String(), uuid.NewV4().String()}
26subscriptions := []*moira.SubscriptionData{{ID: subscriptionIDs[0]}, {ID: subscriptionIDs[1]}}
27database.EXPECT().GetUserSubscriptionIDs(login).Return(subscriptionIDs, nil)
28database.EXPECT().GetSubscriptions(subscriptionIDs).Return(subscriptions, nil)
29list, err := GetUserSubscriptions(database, login)
30So(err, ShouldBeNil)
31So(list, ShouldResemble, &dto.SubscriptionList{List: []moira.SubscriptionData{*subscriptions[0], *subscriptions[1]}})
32})
33
34Convey("Two ids, one subscription", t, func() {
35subscriptionIDs := []string{uuid.NewV4().String(), uuid.NewV4().String()}
36subscriptions := []*moira.SubscriptionData{{ID: subscriptionIDs[1]}}
37database.EXPECT().GetUserSubscriptionIDs(login).Return(subscriptionIDs, nil)
38database.EXPECT().GetSubscriptions(subscriptionIDs).Return(subscriptions, nil)
39list, err := GetUserSubscriptions(database, login)
40So(err, ShouldBeNil)
41So(list, ShouldResemble, &dto.SubscriptionList{List: []moira.SubscriptionData{*subscriptions[0]}})
42})
43
44Convey("Errors", t, func() {
45Convey("GetUserSubscriptionIDs", func() {
46expected := fmt.Errorf("Oh no!!!11 Cant get subscription ids")
47database.EXPECT().GetUserSubscriptionIDs(login).Return(nil, expected)
48list, err := GetUserSubscriptions(database, login)
49So(err, ShouldResemble, api.ErrorInternalServer(expected))
50So(list, ShouldBeNil)
51})
52
53Convey("GetSubscriptions", func() {
54expected := fmt.Errorf("Oh no!!!11 Cant get subscriptions")
55subscriptionIDs := []string{uuid.NewV4().String(), uuid.NewV4().String()}
56database.EXPECT().GetUserSubscriptionIDs(login).Return(subscriptionIDs, nil)
57database.EXPECT().GetSubscriptions(subscriptionIDs).Return(nil, expected)
58list, err := GetUserSubscriptions(database, login)
59So(err, ShouldResemble, api.ErrorInternalServer(expected))
60So(list, ShouldBeNil)
61})
62})
63}
64
65func TestUpdateSubscription(t *testing.T) {
66mockCtrl := gomock.NewController(t)
67dataBase := mock_moira_alert.NewMockDatabase(mockCtrl)
68defer mockCtrl.Finish()
69userLogin := "user"
70
71Convey("Success update", t, func() {
72subscriptionDTO := &dto.Subscription{}
73subscriptionID := uuid.NewV4().String()
74subscription := moira.SubscriptionData{
75ID: subscriptionID,
76User: userLogin,
77}
78dataBase.EXPECT().SaveSubscription(&subscription).Return(nil)
79err := UpdateSubscription(dataBase, subscriptionID, userLogin, subscriptionDTO)
80So(err, ShouldBeNil)
81So(subscriptionDTO.User, ShouldResemble, userLogin)
82So(subscriptionDTO.ID, ShouldResemble, subscriptionID)
83})
84
85Convey("Error save", t, func() {
86subscriptionDTO := &dto.Subscription{}
87subscriptionID := uuid.NewV4().String()
88subscription := moira.SubscriptionData{
89ID: subscriptionID,
90User: userLogin,
91}
92err := fmt.Errorf("Oooops")
93dataBase.EXPECT().SaveSubscription(&subscription).Return(err)
94actual := UpdateSubscription(dataBase, subscriptionID, userLogin, subscriptionDTO)
95So(actual, ShouldResemble, api.ErrorInternalServer(err))
96So(subscriptionDTO.User, ShouldResemble, userLogin)
97So(subscriptionDTO.ID, ShouldResemble, subscriptionID)
98})
99}
100
101func TestRemoveSubscription(t *testing.T) {
102mockCtrl := gomock.NewController(t)
103defer mockCtrl.Finish()
104database := mock_moira_alert.NewMockDatabase(mockCtrl)
105id := uuid.NewV4().String()
106
107Convey("Success", t, func() {
108database.EXPECT().RemoveSubscription(id).Return(nil)
109err := RemoveSubscription(database, id)
110So(err, ShouldBeNil)
111})
112
113Convey("Error", t, func() {
114expected := fmt.Errorf("Oooops! Can not remove subscription")
115database.EXPECT().RemoveSubscription(id).Return(expected)
116err := RemoveSubscription(database, id)
117So(err, ShouldResemble, api.ErrorInternalServer(expected))
118})
119}
120
121func TestSendTestNotification(t *testing.T) {
122mockCtrl := gomock.NewController(t)
123defer mockCtrl.Finish()
124database := mock_moira_alert.NewMockDatabase(mockCtrl)
125id := uuid.NewV4().String()
126
127Convey("Success", t, func() {
128database.EXPECT().PushNotificationEvent(gomock.Any()).Return(nil)
129err := SendTestNotification(database, id)
130So(err, ShouldBeNil)
131})
132
133Convey("Error", t, func() {
134expected := fmt.Errorf("Oooops! Can not push event")
135database.EXPECT().PushNotificationEvent(gomock.Any()).Return(expected)
136err := SendTestNotification(database, id)
137So(err, ShouldResemble, api.ErrorInternalServer(expected))
138})
139}
140
141func TestCreateSubscription(t *testing.T) {
142mockCtrl := gomock.NewController(t)
143defer mockCtrl.Finish()
144dataBase := mock_moira_alert.NewMockDatabase(mockCtrl)
145login := "user"
146
147Convey("Success create", t, func() {
148subscription := dto.Subscription{ID: ""}
149dataBase.EXPECT().SaveSubscription(gomock.Any()).Return(nil)
150err := CreateSubscription(dataBase, login, &subscription)
151So(err, ShouldBeNil)
152})
153
154Convey("Success create subscription with id", t, func() {
155sub := &dto.Subscription{
156ID: uuid.NewV4().String(),
157}
158dataBase.EXPECT().GetSubscription(sub.ID).Return(moira.SubscriptionData{}, database.ErrNil)
159dataBase.EXPECT().SaveSubscription(gomock.Any()).Return(nil)
160err := CreateSubscription(dataBase, login, sub)
161So(err, ShouldBeNil)
162So(sub.User, ShouldResemble, login)
163So(sub.ID, ShouldResemble, sub.ID)
164})
165
166Convey("Subscription exists by id", t, func() {
167subscription := &dto.Subscription{
168ID: uuid.NewV4().String(),
169}
170dataBase.EXPECT().GetSubscription(subscription.ID).Return(moira.SubscriptionData{}, nil)
171err := CreateSubscription(dataBase, login, subscription)
172So(err, ShouldResemble, api.ErrorInvalidRequest(fmt.Errorf("Subscription with this ID already exists")))
173})
174
175Convey("Error get subscription", t, func() {
176subscription := &dto.Subscription{
177ID: uuid.NewV4().String(),
178}
179err := fmt.Errorf("Oooops! Can not write contact")
180dataBase.EXPECT().GetSubscription(subscription.ID).Return(moira.SubscriptionData{}, err)
181expected := CreateSubscription(dataBase, login, subscription)
182So(expected, ShouldResemble, api.ErrorInternalServer(err))
183})
184
185Convey("Error save subscription", t, func() {
186subscription := dto.Subscription{ID: ""}
187expected := fmt.Errorf("Oooops! Can not create subscription")
188dataBase.EXPECT().SaveSubscription(gomock.Any()).Return(expected)
189err := CreateSubscription(dataBase, login, &subscription)
190So(err, ShouldResemble, api.ErrorInternalServer(expected))
191})
192}
193
194func TestCheckUserPermissionsForSubscription(t *testing.T) {
195mockCtrl := gomock.NewController(t)
196defer mockCtrl.Finish()
197dataBase := mock_moira_alert.NewMockDatabase(mockCtrl)
198userLogin := uuid.NewV4().String()
199id := uuid.NewV4().String()
200
201Convey("No subscription", t, func() {
202dataBase.EXPECT().GetSubscription(id).Return(moira.SubscriptionData{}, database.ErrNil)
203expectedSub, expected := CheckUserPermissionsForSubscription(dataBase, id, userLogin)
204So(expected, ShouldResemble, api.ErrorNotFound(fmt.Sprintf("Subscription with ID '%s' does not exists", id)))
205So(expectedSub, ShouldResemble, moira.SubscriptionData{})
206})
207
208Convey("Different user", t, func() {
209actualSub := moira.SubscriptionData{User: "diffUser"}
210dataBase.EXPECT().GetSubscription(id).Return(actualSub, nil)
211expectedSub, expected := CheckUserPermissionsForSubscription(dataBase, id, userLogin)
212So(expected, ShouldResemble, api.ErrorForbidden("You have not permissions"))
213So(expectedSub, ShouldResemble, actualSub)
214})
215
216Convey("Has subscription", t, func() {
217actualSub := moira.SubscriptionData{ID: id, User: userLogin}
218dataBase.EXPECT().GetSubscription(id).Return(actualSub, nil)
219expectedSub, expected := CheckUserPermissionsForSubscription(dataBase, id, userLogin)
220So(expected, ShouldBeNil)
221So(expectedSub, ShouldResemble, actualSub)
222})
223
224Convey("Error get contact", t, func() {
225err := fmt.Errorf("Oooops! Can not read contact")
226dataBase.EXPECT().GetSubscription(id).Return(moira.SubscriptionData{}, err)
227expectedSub, expected := CheckUserPermissionsForSubscription(dataBase, id, userLogin)
228So(expected, ShouldResemble, api.ErrorInternalServer(err))
229So(expectedSub, ShouldResemble, moira.SubscriptionData{})
230})
231}
232