/server/http_test.go

https://github.com/scottleedavis/mattermost-plugin-remind · Go · 1058 lines · 883 code · 175 blank · 0 comment · 15 complexity · a338c238980a4184574a61e90564d08a MD5 · raw file

  1. package main
  2. import (
  3. "bytes"
  4. "encoding/json"
  5. "fmt"
  6. "io/ioutil"
  7. "net/http/httptest"
  8. "os"
  9. "testing"
  10. "time"
  11. "github.com/mattermost/mattermost-server/v5/model"
  12. "github.com/mattermost/mattermost-server/v5/plugin/plugintest"
  13. "github.com/stretchr/testify/assert"
  14. "github.com/stretchr/testify/mock"
  15. )
  16. func TestHandleDialog(t *testing.T) {
  17. user := &model.User{
  18. Id: model.NewId(),
  19. Username: model.NewRandomString(10),
  20. }
  21. testTime := time.Now().UTC().Round(time.Second).Add(20 * time.Duration(time.Minute))
  22. hostname, _ := os.Hostname()
  23. reminderId := model.NewId()
  24. occurrences := []Occurrence{
  25. {
  26. Hostname: hostname,
  27. Id: model.NewId(),
  28. ReminderId: reminderId,
  29. Occurrence: testTime,
  30. },
  31. }
  32. reminders := []Reminder{
  33. {
  34. Id: reminderId,
  35. TeamId: model.NewId(),
  36. Username: user.Username,
  37. Message: "Hello",
  38. Target: "me",
  39. When: "in one minute",
  40. Occurrences: occurrences,
  41. },
  42. }
  43. stringOccurrences, _ := json.Marshal(occurrences)
  44. stringReminders, _ := json.Marshal(reminders)
  45. setupAPI := func() *plugintest.API {
  46. api := &plugintest.API{}
  47. api.On("LogDebug", mock.Anything, mock.Anything, mock.Anything).Maybe()
  48. api.On("LogError", mock.Anything, mock.Anything, mock.Anything).Maybe()
  49. api.On("LogInfo", mock.Anything).Maybe()
  50. api.On("KVGet", string(fmt.Sprintf("%v", testTime))).Return(stringOccurrences, nil)
  51. api.On("KVGet", user.Username).Return(stringReminders, nil)
  52. api.On("KVSet", mock.Anything, mock.Anything).Return(nil)
  53. api.On("GetUser", mock.Anything).Return(user, nil)
  54. api.On("GetUserByUsername", mock.Anything).Return(user, nil)
  55. api.On("SendEphemeralPost", mock.Anything, mock.Anything).Return(nil)
  56. return api
  57. }
  58. t.Run("view dialog", func(t *testing.T) {
  59. api := setupAPI()
  60. defer api.AssertExpectations(t)
  61. p := &Plugin{}
  62. p.router = p.InitAPI()
  63. p.API = api
  64. request := &model.SubmitDialogRequest{
  65. UserId: "userID1",
  66. Submission: model.StringInterface{
  67. "message": "hello",
  68. "target": "me",
  69. "time": "unit.test",
  70. },
  71. }
  72. w := httptest.NewRecorder()
  73. r := httptest.NewRequest("POST", "/dialog", bytes.NewReader(request.ToJson()))
  74. p.ServeHTTP(nil, w, r)
  75. result := w.Result()
  76. assert.NotNil(t, result)
  77. bodyBytes, err := ioutil.ReadAll(result.Body)
  78. assert.Nil(t, err)
  79. bodyString := string(bodyBytes)
  80. assert.Equal(t, bodyString, "")
  81. })
  82. }
  83. func TestHandleViewEphmeral(t *testing.T) {
  84. user := &model.User{
  85. Id: model.NewId(),
  86. Username: model.NewRandomString(10),
  87. }
  88. testTime := time.Now().UTC().Round(time.Second)
  89. occurrences := []Occurrence{
  90. {
  91. Id: model.NewId(),
  92. ReminderId: model.NewId(),
  93. Occurrence: testTime,
  94. },
  95. }
  96. reminders := []Reminder{
  97. {
  98. Id: model.NewId(),
  99. TeamId: model.NewId(),
  100. Username: user.Username,
  101. Message: "Hello",
  102. Target: "me",
  103. When: "in one minute",
  104. Occurrences: occurrences,
  105. },
  106. }
  107. stringReminders, _ := json.Marshal(reminders)
  108. setupAPI := func() *plugintest.API {
  109. api := &plugintest.API{}
  110. api.On("LogDebug", mock.Anything, mock.Anything, mock.Anything).Maybe()
  111. api.On("LogError", mock.Anything, mock.Anything, mock.Anything).Maybe()
  112. api.On("LogInfo", mock.Anything).Maybe()
  113. api.On("GetUser", mock.Anything).Return(user, nil)
  114. api.On("GetUserByUsername", mock.Anything).Return(user, nil)
  115. api.On("KVGet", user.Username).Return(stringReminders, nil)
  116. api.On("CreatePost", mock.Anything).Maybe()
  117. api.On("SendEphemeralPost", mock.Anything, mock.Anything).Return(nil)
  118. return api
  119. }
  120. t.Run("view ephemeral", func(t *testing.T) {
  121. api := setupAPI()
  122. defer api.AssertExpectations(t)
  123. p := &Plugin{}
  124. p.router = p.InitAPI()
  125. p.API = api
  126. request := &model.PostActionIntegrationRequest{
  127. UserId: "userID1",
  128. PostId: "postID1",
  129. Context: model.StringInterface{
  130. "reminder_id": model.NewId(),
  131. "occurrence_id": model.NewId(),
  132. },
  133. }
  134. w := httptest.NewRecorder()
  135. r := httptest.NewRequest("POST", "/view/ephemeral", bytes.NewReader(request.ToJson()))
  136. p.ServeHTTP(nil, w, r)
  137. result := w.Result()
  138. assert.NotNil(t, result)
  139. bodyBytes, err := ioutil.ReadAll(result.Body)
  140. assert.Nil(t, err)
  141. bodyString := string(bodyBytes)
  142. assert.Equal(t, bodyString, "{\"update\":null,\"ephemeral_text\":\"\"}")
  143. })
  144. }
  145. func TestHandleComplete(t *testing.T) {
  146. user := &model.User{
  147. Id: model.NewId(),
  148. Username: model.NewRandomString(10),
  149. }
  150. post := &model.Post{
  151. Id: model.NewId(),
  152. ChannelId: model.NewId(),
  153. }
  154. testTime := time.Now().UTC().Round(time.Second)
  155. occurrences := []Occurrence{
  156. {
  157. Id: model.NewId(),
  158. ReminderId: model.NewId(),
  159. Occurrence: testTime,
  160. },
  161. }
  162. reminders := []Reminder{
  163. {
  164. Id: model.NewId(),
  165. TeamId: model.NewId(),
  166. Username: user.Username,
  167. Message: "Hello",
  168. Target: "me",
  169. When: "in one minute",
  170. Occurrences: occurrences,
  171. },
  172. }
  173. stringReminders, _ := json.Marshal(reminders)
  174. channel := &model.Channel{
  175. Id: model.NewId(),
  176. }
  177. setupAPI := func() *plugintest.API {
  178. api := &plugintest.API{}
  179. api.On("LogDebug", mock.Anything, mock.Anything, mock.Anything).Maybe()
  180. api.On("LogError", mock.Anything, mock.Anything, mock.Anything).Maybe()
  181. api.On("LogInfo", mock.Anything).Maybe()
  182. api.On("GetPost", mock.Anything).Return(post, nil)
  183. api.On("CreatePost", mock.Anything).Return(post, nil)
  184. api.On("UpdatePost", mock.Anything).Return(post, nil)
  185. api.On("GetUser", mock.Anything).Return(user, nil)
  186. api.On("GetUserByUsername", mock.Anything).Return(user, nil)
  187. api.On("KVGet", user.Username).Return(stringReminders, nil)
  188. api.On("KVSet", mock.Anything, mock.Anything).Return(nil)
  189. api.On("GetDirectChannel", mock.Anything, mock.Anything).Return(channel, nil)
  190. return api
  191. }
  192. t.Run("complete", func(t *testing.T) {
  193. api := setupAPI()
  194. defer api.AssertExpectations(t)
  195. p := &Plugin{}
  196. p.router = p.InitAPI()
  197. p.API = api
  198. request := &model.PostActionIntegrationRequest{
  199. UserId: "userID1",
  200. PostId: "postID1",
  201. Context: model.StringInterface{
  202. "orig_user_id": "foobar",
  203. "reminder_id": model.NewId(),
  204. "occurrence_id": model.NewId(),
  205. },
  206. }
  207. w := httptest.NewRecorder()
  208. r := httptest.NewRequest("POST", "/complete", bytes.NewReader(request.ToJson()))
  209. p.ServeHTTP(nil, w, r)
  210. result := w.Result()
  211. assert.NotNil(t, result)
  212. bodyBytes, err := ioutil.ReadAll(result.Body)
  213. assert.Nil(t, err)
  214. bodyString := string(bodyBytes)
  215. assert.Equal(t, bodyString, "{\"update\":null,\"ephemeral_text\":\"\"}")
  216. })
  217. }
  218. func TestHandleDelete(t *testing.T) {
  219. user := &model.User{
  220. Id: model.NewId(),
  221. Username: model.NewRandomString(10),
  222. }
  223. post := &model.Post{
  224. Id: model.NewId(),
  225. ChannelId: model.NewId(),
  226. }
  227. testTime := time.Now().UTC().Round(time.Second)
  228. occurrences := []Occurrence{
  229. {
  230. Id: model.NewId(),
  231. ReminderId: model.NewId(),
  232. Occurrence: testTime,
  233. },
  234. }
  235. reminders := []Reminder{
  236. {
  237. Id: model.NewId(),
  238. TeamId: model.NewId(),
  239. Username: user.Username,
  240. Message: "Hello",
  241. Target: "me",
  242. When: "in one minute",
  243. Occurrences: occurrences,
  244. },
  245. }
  246. stringReminders, _ := json.Marshal(reminders)
  247. setupAPI := func() *plugintest.API {
  248. api := &plugintest.API{}
  249. api.On("LogDebug", mock.Anything, mock.Anything, mock.Anything).Maybe()
  250. api.On("LogError", mock.Anything, mock.Anything, mock.Anything).Maybe()
  251. api.On("LogInfo", mock.Anything).Maybe()
  252. api.On("GetPost", mock.Anything).Return(post, nil)
  253. api.On("UpdatePost", mock.Anything).Return(post, nil)
  254. api.On("GetUser", mock.Anything).Return(user, nil)
  255. api.On("GetUserByUsername", mock.Anything).Return(user, nil)
  256. api.On("KVGet", user.Username).Return(stringReminders, nil)
  257. api.On("KVSet", mock.Anything, mock.Anything).Return(nil)
  258. return api
  259. }
  260. t.Run("delete", func(t *testing.T) {
  261. api := setupAPI()
  262. defer api.AssertExpectations(t)
  263. p := &Plugin{}
  264. p.router = p.InitAPI()
  265. p.API = api
  266. request := &model.PostActionIntegrationRequest{
  267. UserId: "userID1",
  268. PostId: "postID1",
  269. Context: model.StringInterface{
  270. "orig_user_id": "foobar",
  271. "reminder_id": model.NewId(),
  272. "occurrence_id": model.NewId(),
  273. },
  274. }
  275. w := httptest.NewRecorder()
  276. r := httptest.NewRequest("POST", "/delete", bytes.NewReader(request.ToJson()))
  277. p.ServeHTTP(nil, w, r)
  278. result := w.Result()
  279. assert.NotNil(t, result)
  280. bodyBytes, err := ioutil.ReadAll(result.Body)
  281. assert.Nil(t, err)
  282. bodyString := string(bodyBytes)
  283. assert.Equal(t, bodyString, "{\"update\":null,\"ephemeral_text\":\"\"}")
  284. })
  285. }
  286. func TestHandleDeleteEphemeral(t *testing.T) {
  287. user := &model.User{
  288. Id: model.NewId(),
  289. Username: model.NewRandomString(10),
  290. }
  291. post := &model.Post{
  292. Id: model.NewId(),
  293. ChannelId: model.NewId(),
  294. }
  295. testTime := time.Now().UTC().Round(time.Second)
  296. occurrences := []Occurrence{
  297. {
  298. Id: model.NewId(),
  299. ReminderId: model.NewId(),
  300. Occurrence: testTime,
  301. },
  302. }
  303. reminders := []Reminder{
  304. {
  305. Id: model.NewId(),
  306. TeamId: model.NewId(),
  307. Username: user.Username,
  308. Message: "Hello",
  309. Target: "me",
  310. When: "in one minute",
  311. Occurrences: occurrences,
  312. },
  313. }
  314. stringReminders, _ := json.Marshal(reminders)
  315. setupAPI := func() *plugintest.API {
  316. api := &plugintest.API{}
  317. api.On("LogDebug", mock.Anything, mock.Anything, mock.Anything).Maybe()
  318. api.On("LogError", mock.Anything, mock.Anything, mock.Anything).Maybe()
  319. api.On("LogInfo", mock.Anything).Maybe()
  320. api.On("GetUser", mock.Anything).Return(user, nil)
  321. api.On("GetUserByUsername", mock.Anything).Return(user, nil)
  322. api.On("KVGet", user.Username).Return(stringReminders, nil)
  323. api.On("KVSet", mock.Anything, mock.Anything).Return(nil)
  324. api.On("UpdateEphemeralPost", mock.Anything, mock.Anything).Return(post)
  325. return api
  326. }
  327. t.Run("delete ephemeral", func(t *testing.T) {
  328. api := setupAPI()
  329. defer api.AssertExpectations(t)
  330. p := &Plugin{}
  331. p.router = p.InitAPI()
  332. p.API = api
  333. request := &model.PostActionIntegrationRequest{
  334. UserId: "userID1",
  335. PostId: "postID1",
  336. Context: model.StringInterface{
  337. "reminder_id": model.NewId(),
  338. "occurrence_id": model.NewId(),
  339. },
  340. }
  341. w := httptest.NewRecorder()
  342. r := httptest.NewRequest("POST", "/delete/ephemeral", bytes.NewReader(request.ToJson()))
  343. p.ServeHTTP(nil, w, r)
  344. result := w.Result()
  345. assert.NotNil(t, result)
  346. bodyBytes, err := ioutil.ReadAll(result.Body)
  347. assert.Nil(t, err)
  348. bodyString := string(bodyBytes)
  349. assert.Equal(t, bodyString, "{\"update\":null,\"ephemeral_text\":\"\"}")
  350. })
  351. }
  352. func TestHandleSnooze(t *testing.T) {
  353. user := &model.User{
  354. Id: model.NewId(),
  355. Username: model.NewRandomString(10),
  356. }
  357. post := &model.Post{
  358. Id: model.NewId(),
  359. ChannelId: model.NewId(),
  360. }
  361. testTime := time.Now().UTC().Round(time.Second)
  362. occurrences := []Occurrence{
  363. {
  364. Id: model.NewId(),
  365. ReminderId: model.NewId(),
  366. Occurrence: testTime,
  367. },
  368. }
  369. reminders := []Reminder{
  370. {
  371. Id: model.NewId(),
  372. TeamId: model.NewId(),
  373. Username: user.Username,
  374. Message: "Hello",
  375. Target: "me",
  376. When: "in one minute",
  377. Occurrences: occurrences,
  378. },
  379. }
  380. stringReminders, _ := json.Marshal(reminders)
  381. stringOccurrences, _ := json.Marshal(occurrences)
  382. setupAPI := func() *plugintest.API {
  383. api := &plugintest.API{}
  384. api.On("LogDebug", mock.Anything, mock.Anything, mock.Anything).Maybe()
  385. api.On("LogError", mock.Anything, mock.Anything, mock.Anything).Maybe()
  386. api.On("LogInfo", mock.Anything).Maybe()
  387. api.On("GetPost", mock.Anything).Return(post, nil)
  388. api.On("UpdatePost", mock.Anything).Return(post, nil)
  389. api.On("GetUser", mock.Anything).Return(user, nil)
  390. api.On("GetUserByUsername", mock.Anything).Return(user, nil)
  391. api.On("KVGet", user.Username).Return(stringReminders, nil)
  392. api.On("KVGet", mock.Anything).Return(stringOccurrences, nil)
  393. api.On("KVSet", mock.Anything, mock.Anything).Return(nil)
  394. return api
  395. }
  396. for name, test := range map[string]struct {
  397. SnoozeTime string
  398. }{
  399. "snoozes item 20min": {
  400. SnoozeTime: "20min",
  401. },
  402. "snoozes item 1hr": {
  403. SnoozeTime: "1hr",
  404. },
  405. "snoozes item 3hrs": {
  406. SnoozeTime: "3hrs",
  407. },
  408. "snoozes item tomorrow": {
  409. SnoozeTime: "tomorrow",
  410. },
  411. "snoozes item nextweek": {
  412. SnoozeTime: "nextweek",
  413. },
  414. } {
  415. t.Run(name, func(t *testing.T) {
  416. api := setupAPI()
  417. defer api.AssertExpectations(t)
  418. p := &Plugin{}
  419. p.router = p.InitAPI()
  420. p.API = api
  421. request := &model.PostActionIntegrationRequest{
  422. UserId: "userID1",
  423. PostId: "postID1",
  424. Context: model.StringInterface{
  425. "orig_user_id": "foobar",
  426. "reminder_id": reminders[0].Id,
  427. "occurrence_id": occurrences[0].Id,
  428. "selected_option": test.SnoozeTime,
  429. },
  430. }
  431. w := httptest.NewRecorder()
  432. r := httptest.NewRequest("POST", "/snooze", bytes.NewReader(request.ToJson()))
  433. p.ServeHTTP(nil, w, r)
  434. result := w.Result()
  435. assert.NotNil(t, result)
  436. bodyBytes, err := ioutil.ReadAll(result.Body)
  437. assert.Nil(t, err)
  438. bodyString := string(bodyBytes)
  439. assert.Equal(t, bodyString, "{\"update\":null,\"ephemeral_text\":\"\"}")
  440. })
  441. }
  442. }
  443. func TestHandleNextReminders(t *testing.T) {
  444. user := &model.User{
  445. Id: model.NewId(),
  446. Username: model.NewRandomString(10),
  447. }
  448. post := &model.Post{
  449. Id: model.NewId(),
  450. ChannelId: model.NewId(),
  451. }
  452. testTime := time.Now().UTC().Round(time.Second)
  453. occurrences := []Occurrence{
  454. {
  455. Id: model.NewId(),
  456. ReminderId: model.NewId(),
  457. Occurrence: testTime,
  458. },
  459. }
  460. reminders := []Reminder{
  461. {
  462. Id: model.NewId(),
  463. TeamId: model.NewId(),
  464. Username: user.Username,
  465. Message: "Hello",
  466. Target: "me",
  467. When: "in one minute",
  468. Occurrences: occurrences,
  469. },
  470. }
  471. stringReminders, _ := json.Marshal(reminders)
  472. setupAPI := func() *plugintest.API {
  473. api := &plugintest.API{}
  474. api.On("LogDebug", mock.Anything, mock.Anything, mock.Anything).Maybe()
  475. api.On("LogError", mock.Anything, mock.Anything, mock.Anything).Maybe()
  476. api.On("LogInfo", mock.Anything).Maybe()
  477. api.On("GetUser", mock.Anything).Return(user, nil)
  478. api.On("GetUserByUsername", mock.Anything).Return(user, nil)
  479. api.On("KVGet", user.Username).Return(stringReminders, nil)
  480. api.On("UpdateEphemeralPost", mock.Anything, mock.Anything).Return(post)
  481. return api
  482. }
  483. t.Run("next reminders", func(t *testing.T) {
  484. api := setupAPI()
  485. defer api.AssertExpectations(t)
  486. p := &Plugin{}
  487. p.router = p.InitAPI()
  488. p.API = api
  489. request := &model.PostActionIntegrationRequest{
  490. UserId: user.Id,
  491. PostId: post.Id,
  492. Context: model.StringInterface{
  493. "reminder_id": model.NewId(),
  494. "occurrence_id": model.NewId(),
  495. "offset": 0,
  496. },
  497. }
  498. w := httptest.NewRecorder()
  499. r := httptest.NewRequest("POST", "/next/reminders", bytes.NewReader(request.ToJson()))
  500. p.ServeHTTP(nil, w, r)
  501. result := w.Result()
  502. assert.NotNil(t, result)
  503. bodyBytes, err := ioutil.ReadAll(result.Body)
  504. assert.Nil(t, err)
  505. bodyString := string(bodyBytes)
  506. assert.Equal(t, bodyString, "{\"update\":null,\"ephemeral_text\":\"\"}")
  507. })
  508. }
  509. func TestHandleCompleteList(t *testing.T) {
  510. user := &model.User{
  511. Id: model.NewId(),
  512. Username: model.NewRandomString(10),
  513. }
  514. post := &model.Post{
  515. Id: model.NewId(),
  516. ChannelId: model.NewId(),
  517. }
  518. testTime := time.Now().UTC().Round(time.Second)
  519. occurrences := []Occurrence{
  520. {
  521. Id: model.NewId(),
  522. ReminderId: model.NewId(),
  523. Occurrence: testTime,
  524. },
  525. }
  526. reminders := []Reminder{
  527. {
  528. Id: model.NewId(),
  529. TeamId: model.NewId(),
  530. Username: user.Username,
  531. Message: "Hello",
  532. Target: "me",
  533. When: "in one minute",
  534. Occurrences: occurrences,
  535. },
  536. }
  537. stringReminders, _ := json.Marshal(reminders)
  538. setupAPI := func() *plugintest.API {
  539. api := &plugintest.API{}
  540. api.On("LogDebug", mock.Anything, mock.Anything, mock.Anything).Maybe()
  541. api.On("LogError", mock.Anything, mock.Anything, mock.Anything).Maybe()
  542. api.On("LogInfo", mock.Anything).Maybe()
  543. api.On("GetUser", mock.Anything).Return(user, nil)
  544. api.On("GetUserByUsername", mock.Anything).Return(user, nil)
  545. api.On("KVGet", user.Username).Return(stringReminders, nil)
  546. api.On("KVSet", mock.Anything, mock.Anything).Return(nil)
  547. api.On("UpdateEphemeralPost", mock.Anything, mock.Anything).Return(post)
  548. return api
  549. }
  550. t.Run("complete list", func(t *testing.T) {
  551. api := setupAPI()
  552. defer api.AssertExpectations(t)
  553. p := &Plugin{}
  554. p.router = p.InitAPI()
  555. p.API = api
  556. request := &model.PostActionIntegrationRequest{
  557. UserId: "userID1",
  558. PostId: "postID1",
  559. Context: model.StringInterface{
  560. "reminder_id": model.NewId(),
  561. "occurrence_id": model.NewId(),
  562. "offset": 0,
  563. },
  564. }
  565. w := httptest.NewRecorder()
  566. r := httptest.NewRequest("POST", "/complete/list", bytes.NewReader(request.ToJson()))
  567. p.ServeHTTP(nil, w, r)
  568. result := w.Result()
  569. assert.NotNil(t, result)
  570. bodyBytes, err := ioutil.ReadAll(result.Body)
  571. assert.Nil(t, err)
  572. bodyString := string(bodyBytes)
  573. assert.Equal(t, bodyString, "{\"update\":null,\"ephemeral_text\":\"\"}")
  574. })
  575. }
  576. func TestHandleViewCompleteList(t *testing.T) {
  577. user := &model.User{
  578. Id: model.NewId(),
  579. Username: model.NewRandomString(10),
  580. }
  581. post := &model.Post{
  582. Id: model.NewId(),
  583. ChannelId: model.NewId(),
  584. }
  585. testTime := time.Now().UTC().Round(time.Second)
  586. occurrences := []Occurrence{
  587. {
  588. Id: model.NewId(),
  589. ReminderId: model.NewId(),
  590. Occurrence: testTime,
  591. },
  592. }
  593. reminders := []Reminder{
  594. {
  595. Id: model.NewId(),
  596. TeamId: model.NewId(),
  597. Username: user.Username,
  598. Message: "Hello",
  599. Target: "me",
  600. When: "in one minute",
  601. Occurrences: occurrences,
  602. },
  603. }
  604. stringReminders, _ := json.Marshal(reminders)
  605. setupAPI := func() *plugintest.API {
  606. api := &plugintest.API{}
  607. api.On("LogDebug", mock.Anything, mock.Anything, mock.Anything).Maybe()
  608. api.On("LogError", mock.Anything, mock.Anything, mock.Anything).Maybe()
  609. api.On("LogInfo", mock.Anything).Maybe()
  610. api.On("GetUser", mock.Anything).Return(user, nil)
  611. api.On("GetUserByUsername", mock.Anything).Return(user, nil)
  612. api.On("KVGet", user.Username).Return(stringReminders, nil)
  613. api.On("UpdateEphemeralPost", mock.Anything, mock.Anything).Return(post)
  614. return api
  615. }
  616. t.Run("view complete list", func(t *testing.T) {
  617. api := setupAPI()
  618. defer api.AssertExpectations(t)
  619. p := &Plugin{}
  620. p.router = p.InitAPI()
  621. p.API = api
  622. request := &model.PostActionIntegrationRequest{UserId: user.Id, PostId: post.Id}
  623. w := httptest.NewRecorder()
  624. r := httptest.NewRequest("POST", "/view/complete/list", bytes.NewReader(request.ToJson()))
  625. p.ServeHTTP(nil, w, r)
  626. result := w.Result()
  627. assert.NotNil(t, result)
  628. bodyBytes, err := ioutil.ReadAll(result.Body)
  629. assert.Nil(t, err)
  630. bodyString := string(bodyBytes)
  631. assert.Equal(t, bodyString, "{\"update\":null,\"ephemeral_text\":\"\"}")
  632. })
  633. }
  634. func TestHandleDeleteList(t *testing.T) {
  635. user := &model.User{
  636. Id: model.NewId(),
  637. Username: model.NewRandomString(10),
  638. }
  639. post := &model.Post{
  640. Id: model.NewId(),
  641. ChannelId: model.NewId(),
  642. }
  643. testTime := time.Now().UTC().Round(time.Second)
  644. occurrences := []Occurrence{
  645. {
  646. Id: model.NewId(),
  647. ReminderId: model.NewId(),
  648. Occurrence: testTime,
  649. },
  650. }
  651. reminders := []Reminder{
  652. {
  653. Id: model.NewId(),
  654. TeamId: model.NewId(),
  655. Username: user.Username,
  656. Message: "Hello",
  657. Target: "me",
  658. When: "in one minute",
  659. Occurrences: occurrences,
  660. },
  661. }
  662. stringReminders, _ := json.Marshal(reminders)
  663. setupAPI := func() *plugintest.API {
  664. api := &plugintest.API{}
  665. api.On("LogDebug", mock.Anything, mock.Anything, mock.Anything).Maybe()
  666. api.On("LogError", mock.Anything, mock.Anything, mock.Anything).Maybe()
  667. api.On("LogInfo", mock.Anything).Maybe()
  668. api.On("GetUser", mock.Anything).Return(user, nil)
  669. api.On("GetUserByUsername", mock.Anything).Return(user, nil)
  670. api.On("KVGet", user.Username).Return(stringReminders, nil)
  671. api.On("KVSet", mock.Anything, mock.Anything).Return(nil)
  672. api.On("UpdateEphemeralPost", mock.Anything, mock.Anything).Return(post)
  673. return api
  674. }
  675. t.Run("delete list item", func(t *testing.T) {
  676. api := setupAPI()
  677. defer api.AssertExpectations(t)
  678. p := &Plugin{}
  679. p.router = p.InitAPI()
  680. p.API = api
  681. request := &model.PostActionIntegrationRequest{
  682. UserId: "userID1",
  683. PostId: "postID1",
  684. Context: model.StringInterface{
  685. "reminder_id": model.NewId(),
  686. "occurrence_id": model.NewId(),
  687. "offset": 0,
  688. },
  689. }
  690. w := httptest.NewRecorder()
  691. r := httptest.NewRequest("POST", "/delete/list", bytes.NewReader(request.ToJson()))
  692. p.ServeHTTP(nil, w, r)
  693. result := w.Result()
  694. assert.NotNil(t, result)
  695. bodyBytes, err := ioutil.ReadAll(result.Body)
  696. assert.Nil(t, err)
  697. bodyString := string(bodyBytes)
  698. assert.Equal(t, bodyString, "{\"update\":null,\"ephemeral_text\":\"\"}")
  699. })
  700. }
  701. func TestHandleDeleteCompleteList(t *testing.T) {
  702. user := &model.User{
  703. Id: model.NewId(),
  704. Username: model.NewRandomString(10),
  705. }
  706. post := &model.Post{
  707. Id: model.NewId(),
  708. ChannelId: model.NewId(),
  709. }
  710. testTime := time.Now().UTC().Round(time.Second)
  711. occurrences := []Occurrence{
  712. {
  713. Id: model.NewId(),
  714. ReminderId: model.NewId(),
  715. Occurrence: testTime,
  716. },
  717. }
  718. reminders := []Reminder{
  719. {
  720. Id: model.NewId(),
  721. TeamId: model.NewId(),
  722. Username: user.Username,
  723. Message: "Hello",
  724. Target: "me",
  725. When: "in one minute",
  726. Occurrences: occurrences,
  727. },
  728. }
  729. stringReminders, _ := json.Marshal(reminders)
  730. setupAPI := func() *plugintest.API {
  731. api := &plugintest.API{}
  732. api.On("LogDebug", mock.Anything, mock.Anything, mock.Anything).Maybe()
  733. api.On("LogError", mock.Anything, mock.Anything, mock.Anything).Maybe()
  734. api.On("LogInfo", mock.Anything).Maybe()
  735. api.On("GetUser", mock.Anything).Return(user, nil)
  736. api.On("GetUserByUsername", mock.Anything).Return(user, nil)
  737. api.On("UpdateEphemeralPost", mock.Anything, mock.Anything).Return(post)
  738. api.On("KVGet", user.Username).Return(stringReminders, nil)
  739. return api
  740. }
  741. t.Run("delete completed list", func(t *testing.T) {
  742. api := setupAPI()
  743. defer api.AssertExpectations(t)
  744. p := &Plugin{}
  745. p.router = p.InitAPI()
  746. p.API = api
  747. request := &model.PostActionIntegrationRequest{
  748. UserId: "userID1",
  749. PostId: "postID1",
  750. Context: model.StringInterface{
  751. "reminder_id": model.NewId(),
  752. "occurrence_id": model.NewId(),
  753. "offset": 0,
  754. },
  755. }
  756. w := httptest.NewRecorder()
  757. r := httptest.NewRequest("POST", "/delete/complete/list", bytes.NewReader(request.ToJson()))
  758. p.ServeHTTP(nil, w, r)
  759. result := w.Result()
  760. assert.NotNil(t, result)
  761. bodyBytes, err := ioutil.ReadAll(result.Body)
  762. assert.Nil(t, err)
  763. bodyString := string(bodyBytes)
  764. assert.Equal(t, bodyString, "{\"update\":null,\"ephemeral_text\":\"\"}")
  765. })
  766. }
  767. func TestHandleSnoozeList(t *testing.T) {
  768. user := &model.User{
  769. Id: model.NewId(),
  770. Username: model.NewRandomString(10),
  771. }
  772. post := &model.Post{
  773. Id: model.NewId(),
  774. ChannelId: model.NewId(),
  775. }
  776. testTime := time.Now().UTC().Round(time.Second)
  777. occurrences := []Occurrence{
  778. {
  779. Id: model.NewId(),
  780. ReminderId: model.NewId(),
  781. Occurrence: testTime,
  782. },
  783. }
  784. reminders := []Reminder{
  785. {
  786. Id: model.NewId(),
  787. TeamId: model.NewId(),
  788. Username: user.Username,
  789. Message: "Hello",
  790. Target: "me",
  791. When: "in one minute",
  792. Occurrences: occurrences,
  793. },
  794. }
  795. stringReminders, _ := json.Marshal(reminders)
  796. stringOccurrences, _ := json.Marshal(occurrences)
  797. setupAPI := func() *plugintest.API {
  798. api := &plugintest.API{}
  799. api.On("LogDebug", mock.Anything, mock.Anything, mock.Anything).Maybe()
  800. api.On("LogError", mock.Anything, mock.Anything, mock.Anything).Maybe()
  801. api.On("LogInfo", mock.Anything).Maybe()
  802. api.On("GetUser", mock.Anything).Return(user, nil)
  803. api.On("GetUserByUsername", mock.Anything).Return(user, nil)
  804. api.On("KVGet", user.Username).Return(stringReminders, nil)
  805. api.On("KVGet", mock.Anything).Return(stringOccurrences, nil)
  806. api.On("KVSet", mock.Anything, mock.Anything).Return(nil)
  807. api.On("UpdateEphemeralPost", mock.Anything, mock.Anything).Return(post)
  808. return api
  809. }
  810. for name, test := range map[string]struct {
  811. SnoozeTime string
  812. }{
  813. "snoozes list item 20min": {
  814. SnoozeTime: "20min",
  815. },
  816. "snoozes list item 1hr": {
  817. SnoozeTime: "1hr",
  818. },
  819. "snoozes list item 3hrs": {
  820. SnoozeTime: "3hrs",
  821. },
  822. "snoozes list item tomorrow": {
  823. SnoozeTime: "tomorrow",
  824. },
  825. "snoozes list item nextweek": {
  826. SnoozeTime: "nextweek",
  827. },
  828. } {
  829. t.Run(name, func(t *testing.T) {
  830. api := setupAPI()
  831. defer api.AssertExpectations(t)
  832. p := &Plugin{}
  833. p.router = p.InitAPI()
  834. p.API = api
  835. request := &model.PostActionIntegrationRequest{
  836. UserId: "userID1",
  837. PostId: "postID1",
  838. Context: model.StringInterface{
  839. "reminder_id": reminders[0].Id,
  840. "occurrence_id": occurrences[0].Id,
  841. "selected_option": test.SnoozeTime,
  842. "offset": 0,
  843. },
  844. }
  845. w := httptest.NewRecorder()
  846. r := httptest.NewRequest("POST", "/snooze/list", bytes.NewReader(request.ToJson()))
  847. p.ServeHTTP(nil, w, r)
  848. result := w.Result()
  849. assert.NotNil(t, result)
  850. bodyBytes, err := ioutil.ReadAll(result.Body)
  851. assert.Nil(t, err)
  852. bodyString := string(bodyBytes)
  853. assert.Equal(t, bodyString, "{\"update\":null,\"ephemeral_text\":\"\"}")
  854. })
  855. }
  856. }
  857. func TestHandleCloseList(t *testing.T) {
  858. setupAPI := func() *plugintest.API {
  859. api := &plugintest.API{}
  860. api.On("LogDebug", mock.Anything, mock.Anything, mock.Anything).Maybe()
  861. api.On("LogError", mock.Anything, mock.Anything, mock.Anything).Maybe()
  862. api.On("LogInfo", mock.Anything).Maybe()
  863. api.On("DeleteEphemeralPost", mock.Anything, mock.Anything).Return(nil)
  864. return api
  865. }
  866. t.Run("closes list", func(t *testing.T) {
  867. api := setupAPI()
  868. defer api.AssertExpectations(t)
  869. p := &Plugin{}
  870. p.router = p.InitAPI()
  871. p.API = api
  872. request := &model.PostActionIntegrationRequest{UserId: "userID1", PostId: "postID1"}
  873. w := httptest.NewRecorder()
  874. r := httptest.NewRequest("POST", "/close/list", bytes.NewReader(request.ToJson()))
  875. p.ServeHTTP(nil, w, r)
  876. result := w.Result()
  877. assert.NotNil(t, result)
  878. bodyBytes, err := ioutil.ReadAll(result.Body)
  879. assert.Nil(t, err)
  880. bodyString := string(bodyBytes)
  881. assert.Equal(t, bodyString, "{\"update\":null,\"ephemeral_text\":\"\"}")
  882. })
  883. }