/server/poll/poll_test.go

https://github.com/matterpoll/matterpoll · Go · 799 lines · 758 code · 41 blank · 0 comment · 15 complexity · aefa390456092f27bd320fc9dce4b239 MD5 · raw file

  1. package poll_test
  2. import (
  3. "fmt"
  4. "testing"
  5. "bou.ke/monkey"
  6. "github.com/mattermost/mattermost-server/v5/model"
  7. "github.com/stretchr/testify/assert"
  8. "github.com/stretchr/testify/require"
  9. "github.com/matterpoll/matterpoll/server/poll"
  10. "github.com/matterpoll/matterpoll/server/utils/testutils"
  11. )
  12. func TestNewPoll(t *testing.T) {
  13. t.Run("all fine", func(t *testing.T) {
  14. assert := assert.New(t)
  15. patch1 := monkey.Patch(model.GetMillis, func() int64 { return 1234567890 })
  16. patch2 := monkey.Patch(model.NewId, testutils.GetPollID)
  17. defer patch1.Unpatch()
  18. defer patch2.Unpatch()
  19. creator := model.NewRandomString(10)
  20. question := model.NewRandomString(10)
  21. answerOptions := []string{model.NewRandomString(10), model.NewRandomString(10), model.NewRandomString(10)}
  22. p, err := poll.NewPoll(creator, question, answerOptions, poll.Settings{
  23. Anonymous: true,
  24. Progress: true,
  25. PublicAddOption: true,
  26. MaxVotes: 3,
  27. })
  28. require.Nil(t, err)
  29. require.NotNil(t, p)
  30. assert.Equal(testutils.GetPollID(), p.ID)
  31. assert.Equal(int64(1234567890), p.CreatedAt)
  32. assert.Equal(creator, p.Creator)
  33. assert.Equal(question, p.Question)
  34. assert.Equal(&poll.AnswerOption{Answer: answerOptions[0], Voter: []string{}}, p.AnswerOptions[0])
  35. assert.Equal(&poll.AnswerOption{Answer: answerOptions[1], Voter: []string{}}, p.AnswerOptions[1])
  36. assert.Equal(&poll.AnswerOption{Answer: answerOptions[2], Voter: []string{}}, p.AnswerOptions[2])
  37. assert.Equal(poll.Settings{Anonymous: true, Progress: true, PublicAddOption: true, MaxVotes: 3}, p.Settings)
  38. })
  39. t.Run("error, invalid votes setting", func(t *testing.T) {
  40. assert := assert.New(t)
  41. patch1 := monkey.Patch(model.GetMillis, func() int64 { return 1234567890 })
  42. patch2 := monkey.Patch(model.NewId, testutils.GetPollID)
  43. defer patch1.Unpatch()
  44. defer patch2.Unpatch()
  45. creator := model.NewRandomString(10)
  46. question := model.NewRandomString(10)
  47. answerOptions := []string{model.NewRandomString(10), model.NewRandomString(10), model.NewRandomString(10)}
  48. p, err := poll.NewPoll(creator, question, answerOptions, poll.Settings{
  49. Anonymous: true,
  50. Progress: true,
  51. PublicAddOption: true,
  52. MaxVotes: 4,
  53. })
  54. assert.Nil(p)
  55. assert.NotNil(err)
  56. })
  57. t.Run("error, duplicate option", func(t *testing.T) {
  58. assert := assert.New(t)
  59. creator := model.NewRandomString(10)
  60. question := model.NewRandomString(10)
  61. option := model.NewRandomString(10)
  62. answerOptions := []string{option, model.NewRandomString(10), option}
  63. p, err := poll.NewPoll(creator, question, answerOptions, poll.Settings{MaxVotes: 1})
  64. assert.Nil(p)
  65. assert.NotNil(err)
  66. })
  67. }
  68. func TestNewSettingsFromStrings(t *testing.T) {
  69. for name, test := range map[string]struct {
  70. Strs []string
  71. ShouldError bool
  72. ExpectedSettings poll.Settings
  73. }{
  74. "no settings": {
  75. Strs: []string{},
  76. ShouldError: false,
  77. ExpectedSettings: poll.Settings{
  78. Anonymous: false,
  79. Progress: false,
  80. PublicAddOption: false,
  81. MaxVotes: 1,
  82. },
  83. },
  84. "full settings": {
  85. Strs: []string{"anonymous", "progress", "public-add-option", "votes=4"},
  86. ShouldError: false,
  87. ExpectedSettings: poll.Settings{
  88. Anonymous: true,
  89. Progress: true,
  90. PublicAddOption: true,
  91. MaxVotes: 4,
  92. },
  93. },
  94. "without votes settings": {
  95. Strs: []string{"anonymous", "progress", "public-add-option"},
  96. ShouldError: false,
  97. ExpectedSettings: poll.Settings{
  98. Anonymous: true,
  99. Progress: true,
  100. PublicAddOption: true,
  101. MaxVotes: 1,
  102. },
  103. },
  104. "invalid votes setting": {
  105. Strs: []string{"votes=9223372036854775808"}, // Exceed math.MaxInt64
  106. ShouldError: true,
  107. ExpectedSettings: poll.Settings{
  108. Anonymous: false,
  109. Progress: false,
  110. PublicAddOption: false,
  111. MaxVotes: 1,
  112. },
  113. },
  114. "invalid setting": {
  115. Strs: []string{"anonymous", "progress", "public-add-option", "invalid"},
  116. ShouldError: true,
  117. ExpectedSettings: poll.Settings{
  118. Anonymous: true,
  119. Progress: true,
  120. PublicAddOption: true,
  121. MaxVotes: 1,
  122. },
  123. },
  124. } {
  125. t.Run(name, func(t *testing.T) {
  126. assert := assert.New(t)
  127. settings, errMsg := poll.NewSettingsFromStrings(test.Strs)
  128. if test.ShouldError {
  129. assert.NotNil(errMsg)
  130. } else {
  131. assert.Nil(errMsg)
  132. }
  133. assert.Equal(test.ExpectedSettings, settings)
  134. })
  135. }
  136. }
  137. func TestNewSettingsFromSubmission(t *testing.T) {
  138. for name, test := range map[string]struct {
  139. Submission map[string]interface{}
  140. ExpectedSettings poll.Settings
  141. }{
  142. "no settings": {
  143. Submission: map[string]interface{}{},
  144. ExpectedSettings: poll.Settings{
  145. Anonymous: false,
  146. Progress: false,
  147. PublicAddOption: false,
  148. MaxVotes: 1,
  149. },
  150. },
  151. "full settings": {
  152. Submission: map[string]interface{}{
  153. "setting-anonymous": true,
  154. "setting-progress": true,
  155. "setting-public-add-option": true,
  156. "setting-multi": float64(4),
  157. },
  158. ExpectedSettings: poll.Settings{
  159. Anonymous: true,
  160. Progress: true,
  161. PublicAddOption: true,
  162. MaxVotes: 4,
  163. },
  164. },
  165. "without votes settings": {
  166. Submission: map[string]interface{}{
  167. "setting-anonymous": false,
  168. "setting-progress": false,
  169. "setting-public-add-option": false,
  170. },
  171. ExpectedSettings: poll.Settings{
  172. Anonymous: false,
  173. Progress: false,
  174. PublicAddOption: false,
  175. MaxVotes: 1,
  176. },
  177. },
  178. } {
  179. t.Run(name, func(t *testing.T) {
  180. assert := assert.New(t)
  181. settings := poll.NewSettingsFromSubmission(test.Submission)
  182. assert.Equal(test.ExpectedSettings, settings)
  183. })
  184. }
  185. }
  186. func TestAddAnswerOption(t *testing.T) {
  187. assert := assert.New(t)
  188. t.Run("all fine", func(t *testing.T) {
  189. p := testutils.GetPollWithVotes()
  190. err := p.AddAnswerOption("new option")
  191. assert.Nil(err)
  192. assert.Equal("new option", p.AnswerOptions[len(p.AnswerOptions)-1].Answer)
  193. })
  194. t.Run("dublicant options", func(t *testing.T) {
  195. p := testutils.GetPollWithVotes()
  196. err := p.AddAnswerOption(p.AnswerOptions[0].Answer)
  197. assert.NotNil(err)
  198. })
  199. t.Run("dublicant options with spaces", func(t *testing.T) {
  200. p := testutils.GetPollWithVotes()
  201. err := p.AddAnswerOption(fmt.Sprintf(" %s ", p.AnswerOptions[0].Answer))
  202. assert.NotNil(err)
  203. })
  204. t.Run("empty options", func(t *testing.T) {
  205. p := testutils.GetPollWithVotes()
  206. err := p.AddAnswerOption("")
  207. assert.NotNil(err)
  208. })
  209. t.Run("empty optinos with spaces", func(t *testing.T) {
  210. p := testutils.GetPollWithVotes()
  211. err := p.AddAnswerOption(" ")
  212. assert.NotNil(err)
  213. })
  214. }
  215. func TestEncodeDecode(t *testing.T) {
  216. p1 := testutils.GetPollWithVotes()
  217. p2 := poll.DecodePollFromByte(p1.EncodeToByte())
  218. assert.Equal(t, p1, p2)
  219. }
  220. func TestDecode(t *testing.T) {
  221. p := poll.DecodePollFromByte([]byte{})
  222. assert.Nil(t, p)
  223. }
  224. func TestUpdateVote(t *testing.T) {
  225. for name, test := range map[string]struct {
  226. Poll poll.Poll
  227. UserID string
  228. Index int
  229. ExpectedPoll poll.Poll
  230. Error bool
  231. ReturnMessage bool
  232. }{
  233. "Negative Index": {
  234. Poll: poll.Poll{
  235. Question: "Question",
  236. AnswerOptions: []*poll.AnswerOption{
  237. {Answer: "Answer 1",
  238. Voter: []string{"a"}},
  239. {Answer: "Answer 2"},
  240. },
  241. },
  242. UserID: "a",
  243. Index: -1,
  244. ExpectedPoll: poll.Poll{
  245. Question: "Question",
  246. AnswerOptions: []*poll.AnswerOption{
  247. {Answer: "Answer 1",
  248. Voter: []string{"a"}},
  249. {Answer: "Answer 2"},
  250. },
  251. },
  252. Error: true,
  253. ReturnMessage: false,
  254. },
  255. "To high Index": {
  256. Poll: poll.Poll{
  257. Question: "Question",
  258. AnswerOptions: []*poll.AnswerOption{
  259. {Answer: "Answer 1",
  260. Voter: []string{"a"}},
  261. {Answer: "Answer 2"},
  262. },
  263. },
  264. UserID: "a",
  265. Index: 2,
  266. ExpectedPoll: poll.Poll{
  267. Question: "Question",
  268. AnswerOptions: []*poll.AnswerOption{
  269. {Answer: "Answer 1",
  270. Voter: []string{"a"}},
  271. {Answer: "Answer 2"},
  272. },
  273. },
  274. Error: true,
  275. ReturnMessage: false,
  276. },
  277. "Invalid userID": {
  278. Poll: poll.Poll{
  279. Question: "Question",
  280. AnswerOptions: []*poll.AnswerOption{
  281. {Answer: "Answer 1",
  282. Voter: []string{"a"}},
  283. {Answer: "Answer 2"},
  284. },
  285. },
  286. UserID: "",
  287. Index: 1,
  288. ExpectedPoll: poll.Poll{
  289. Question: "Question",
  290. AnswerOptions: []*poll.AnswerOption{
  291. {Answer: "Answer 1",
  292. Voter: []string{"a"}},
  293. {Answer: "Answer 2"},
  294. },
  295. },
  296. Error: true,
  297. ReturnMessage: false,
  298. },
  299. "Idempotent": {
  300. Poll: poll.Poll{
  301. Question: "Question",
  302. AnswerOptions: []*poll.AnswerOption{
  303. {Answer: "Answer 1",
  304. Voter: []string{"a"}},
  305. {Answer: "Answer 2"},
  306. },
  307. },
  308. UserID: "a",
  309. Index: 0,
  310. ExpectedPoll: poll.Poll{
  311. Question: "Question",
  312. AnswerOptions: []*poll.AnswerOption{
  313. {Answer: "Answer 1",
  314. Voter: []string{"a"}},
  315. {Answer: "Answer 2"},
  316. },
  317. },
  318. Error: false,
  319. ReturnMessage: false,
  320. },
  321. "Valid Vote": {
  322. Poll: poll.Poll{
  323. Question: "Question",
  324. AnswerOptions: []*poll.AnswerOption{
  325. {Answer: "Answer 1",
  326. Voter: []string{"a"}},
  327. {Answer: "Answer 2"},
  328. },
  329. },
  330. UserID: "a",
  331. Index: 1,
  332. ExpectedPoll: poll.Poll{
  333. Question: "Question",
  334. AnswerOptions: []*poll.AnswerOption{
  335. {Answer: "Answer 1",
  336. Voter: []string{}},
  337. {Answer: "Answer 2",
  338. Voter: []string{"a"}},
  339. },
  340. },
  341. Error: false,
  342. ReturnMessage: false,
  343. },
  344. "Multi votes setting, first vote": {
  345. Poll: poll.Poll{
  346. Question: "Question",
  347. AnswerOptions: []*poll.AnswerOption{
  348. {Answer: "Answer 1"},
  349. {Answer: "Answer 2"},
  350. {Answer: "Answer 3"},
  351. },
  352. Settings: poll.Settings{MaxVotes: 2},
  353. },
  354. UserID: "a",
  355. Index: 0,
  356. ExpectedPoll: poll.Poll{
  357. Question: "Question",
  358. AnswerOptions: []*poll.AnswerOption{
  359. {Answer: "Answer 1", Voter: []string{"a"}},
  360. {Answer: "Answer 2"},
  361. {Answer: "Answer 3"},
  362. },
  363. Settings: poll.Settings{MaxVotes: 2},
  364. },
  365. Error: false,
  366. ReturnMessage: false,
  367. },
  368. "Multi votes setting, second vote": {
  369. Poll: poll.Poll{
  370. Question: "Question",
  371. AnswerOptions: []*poll.AnswerOption{
  372. {Answer: "Answer 1", Voter: []string{"a"}},
  373. {Answer: "Answer 2"},
  374. {Answer: "Answer 3"},
  375. },
  376. Settings: poll.Settings{MaxVotes: 2},
  377. },
  378. UserID: "a",
  379. Index: 1,
  380. ExpectedPoll: poll.Poll{
  381. Question: "Question",
  382. AnswerOptions: []*poll.AnswerOption{
  383. {Answer: "Answer 1", Voter: []string{"a"}},
  384. {Answer: "Answer 2", Voter: []string{"a"}},
  385. {Answer: "Answer 3"},
  386. },
  387. Settings: poll.Settings{MaxVotes: 2},
  388. },
  389. Error: false,
  390. ReturnMessage: false,
  391. },
  392. "Multi votes setting, duplicated vote error": {
  393. Poll: poll.Poll{
  394. Question: "Question",
  395. AnswerOptions: []*poll.AnswerOption{
  396. {Answer: "Answer 1", Voter: []string{"a"}},
  397. {Answer: "Answer 2"},
  398. {Answer: "Answer 3"},
  399. },
  400. Settings: poll.Settings{MaxVotes: 2},
  401. },
  402. UserID: "a",
  403. Index: 0,
  404. ExpectedPoll: poll.Poll{
  405. Question: "Question",
  406. AnswerOptions: []*poll.AnswerOption{
  407. {Answer: "Answer 1", Voter: []string{"a"}},
  408. {Answer: "Answer 2"},
  409. {Answer: "Answer 3"},
  410. },
  411. Settings: poll.Settings{MaxVotes: 2},
  412. },
  413. Error: false,
  414. ReturnMessage: true,
  415. },
  416. "Multi votes setting, with progress option, duplicated vote error": {
  417. Poll: poll.Poll{
  418. Question: "Question",
  419. AnswerOptions: []*poll.AnswerOption{
  420. {Answer: "Answer 1", Voter: []string{"a"}},
  421. {Answer: "Answer 2"},
  422. {Answer: "Answer 3"},
  423. },
  424. Settings: poll.Settings{Progress: true, MaxVotes: 2},
  425. },
  426. UserID: "a",
  427. Index: 0,
  428. ExpectedPoll: poll.Poll{
  429. Question: "Question",
  430. AnswerOptions: []*poll.AnswerOption{
  431. {Answer: "Answer 1", Voter: []string{"a"}},
  432. {Answer: "Answer 2"},
  433. {Answer: "Answer 3"},
  434. },
  435. Settings: poll.Settings{Progress: true, MaxVotes: 2},
  436. },
  437. Error: false,
  438. ReturnMessage: true,
  439. },
  440. "Multi votes setting, exceed votes error": {
  441. Poll: poll.Poll{
  442. Question: "Question",
  443. AnswerOptions: []*poll.AnswerOption{
  444. {Answer: "Answer 1", Voter: []string{"a"}},
  445. {Answer: "Answer 2", Voter: []string{"a"}},
  446. {Answer: "Answer 3"},
  447. },
  448. Settings: poll.Settings{MaxVotes: 2},
  449. },
  450. UserID: "a",
  451. Index: 2,
  452. ExpectedPoll: poll.Poll{
  453. Question: "Question",
  454. AnswerOptions: []*poll.AnswerOption{
  455. {Answer: "Answer 1", Voter: []string{"a"}},
  456. {Answer: "Answer 2", Voter: []string{"a"}},
  457. {Answer: "Answer 3"},
  458. },
  459. Settings: poll.Settings{MaxVotes: 2},
  460. },
  461. Error: false,
  462. ReturnMessage: true,
  463. },
  464. "Multi votes setting, invalid user id error": {
  465. Poll: poll.Poll{
  466. Question: "Question",
  467. AnswerOptions: []*poll.AnswerOption{
  468. {Answer: "Answer 1", Voter: []string{"a"}},
  469. {Answer: "Answer 2", Voter: []string{"a"}},
  470. {Answer: "Answer 3"},
  471. },
  472. Settings: poll.Settings{MaxVotes: 2},
  473. },
  474. UserID: "",
  475. Index: 2,
  476. ExpectedPoll: poll.Poll{
  477. Question: "Question",
  478. AnswerOptions: []*poll.AnswerOption{
  479. {Answer: "Answer 1", Voter: []string{"a"}},
  480. {Answer: "Answer 2", Voter: []string{"a"}},
  481. {Answer: "Answer 3"},
  482. },
  483. Settings: poll.Settings{MaxVotes: 2},
  484. },
  485. Error: true,
  486. ReturnMessage: false,
  487. },
  488. } {
  489. t.Run(name, func(t *testing.T) {
  490. assert := assert.New(t)
  491. msg, err := test.Poll.UpdateVote(test.UserID, test.Index)
  492. if test.Error {
  493. assert.NotNil(err)
  494. } else {
  495. assert.Nil(err)
  496. }
  497. if test.ReturnMessage {
  498. assert.NotNil(msg)
  499. } else {
  500. assert.Nil(msg)
  501. }
  502. assert.Equal(test.ExpectedPoll, test.Poll)
  503. })
  504. }
  505. }
  506. func TestResetVotes(t *testing.T) {
  507. for name, test := range map[string]struct {
  508. Poll poll.Poll
  509. UserID string
  510. ExpectedPoll poll.Poll
  511. }{
  512. "Reset success, with votes": {
  513. Poll: poll.Poll{
  514. ID: testutils.GetPollID(),
  515. AnswerOptions: []*poll.AnswerOption{
  516. {Answer: "Answer 1", Voter: []string{"a"}},
  517. {Answer: "Answer 2", Voter: []string{"a"}},
  518. {Answer: "Answer 3", Voter: []string{"a"}},
  519. },
  520. Settings: poll.Settings{MaxVotes: 3},
  521. },
  522. UserID: "a",
  523. ExpectedPoll: poll.Poll{
  524. ID: testutils.GetPollID(),
  525. AnswerOptions: []*poll.AnswerOption{
  526. {Answer: "Answer 1", Voter: []string{}},
  527. {Answer: "Answer 2", Voter: []string{}},
  528. {Answer: "Answer 3", Voter: []string{}},
  529. },
  530. Settings: poll.Settings{MaxVotes: 3},
  531. },
  532. },
  533. "Reset success, with no votes": {
  534. Poll: poll.Poll{
  535. ID: testutils.GetPollID(),
  536. AnswerOptions: []*poll.AnswerOption{
  537. {Answer: "Answer 1", Voter: []string{}},
  538. {Answer: "Answer 2", Voter: []string{}},
  539. {Answer: "Answer 3", Voter: []string{}},
  540. },
  541. Settings: poll.Settings{MaxVotes: 3},
  542. },
  543. UserID: "a",
  544. ExpectedPoll: poll.Poll{
  545. ID: testutils.GetPollID(),
  546. AnswerOptions: []*poll.AnswerOption{
  547. {Answer: "Answer 1", Voter: []string{}},
  548. {Answer: "Answer 2", Voter: []string{}},
  549. {Answer: "Answer 3", Voter: []string{}},
  550. },
  551. Settings: poll.Settings{MaxVotes: 3},
  552. },
  553. },
  554. "Reset success, with votes from multi user": {
  555. Poll: poll.Poll{
  556. ID: testutils.GetPollID(),
  557. AnswerOptions: []*poll.AnswerOption{
  558. {Answer: "Answer 1", Voter: []string{"a", "b"}},
  559. {Answer: "Answer 2", Voter: []string{"a"}},
  560. {Answer: "Answer 3", Voter: []string{"1", "a", "z"}},
  561. },
  562. Settings: poll.Settings{MaxVotes: 3},
  563. },
  564. UserID: "a",
  565. ExpectedPoll: poll.Poll{
  566. ID: testutils.GetPollID(),
  567. AnswerOptions: []*poll.AnswerOption{
  568. {Answer: "Answer 1", Voter: []string{"b"}},
  569. {Answer: "Answer 2", Voter: []string{}},
  570. {Answer: "Answer 3", Voter: []string{"1", "z"}},
  571. },
  572. Settings: poll.Settings{MaxVotes: 3},
  573. },
  574. },
  575. "invalid user id": {
  576. Poll: poll.Poll{
  577. ID: testutils.GetPollID(),
  578. AnswerOptions: []*poll.AnswerOption{
  579. {Answer: "Answer 1", Voter: []string{"a"}},
  580. {Answer: "Answer 2", Voter: []string{"a"}},
  581. },
  582. Settings: poll.Settings{MaxVotes: 3},
  583. },
  584. UserID: "",
  585. ExpectedPoll: poll.Poll{
  586. ID: testutils.GetPollID(),
  587. AnswerOptions: []*poll.AnswerOption{
  588. {Answer: "Answer 1", Voter: []string{"a"}},
  589. {Answer: "Answer 2", Voter: []string{"a"}},
  590. },
  591. Settings: poll.Settings{MaxVotes: 3},
  592. },
  593. },
  594. } {
  595. t.Run(name, func(t *testing.T) {
  596. assert := assert.New(t)
  597. test.Poll.ResetVotes(test.UserID)
  598. assert.Equal(test.ExpectedPoll, test.Poll)
  599. })
  600. }
  601. }
  602. func TestGetMetadata(t *testing.T) {
  603. for name, test := range map[string]struct {
  604. Poll poll.Poll
  605. UserID string
  606. Permission bool
  607. ExpectedResponse *poll.Metadata
  608. }{
  609. "Voted an Answer": {
  610. Poll: poll.Poll{
  611. ID: testutils.GetPollID(),
  612. AnswerOptions: []*poll.AnswerOption{
  613. {Answer: "Answer 1", Voter: []string{"a"}},
  614. {Answer: "Answer 2", Voter: []string{"b"}},
  615. {Answer: "Answer 3", Voter: []string{"b"}},
  616. },
  617. },
  618. UserID: "a",
  619. Permission: true,
  620. ExpectedResponse: &poll.Metadata{
  621. PollID: testutils.GetPollID(),
  622. UserID: "a",
  623. AdminPermission: true,
  624. VotedAnswers: []string{"Answer 1"},
  625. },
  626. },
  627. "Voted two Answers": {
  628. Poll: poll.Poll{
  629. ID: testutils.GetPollID(),
  630. AnswerOptions: []*poll.AnswerOption{
  631. {Answer: "Answer 1", Voter: []string{"a"}},
  632. {Answer: "Answer 2", Voter: []string{"b"}},
  633. {Answer: "Answer 3", Voter: []string{"b"}},
  634. },
  635. },
  636. UserID: "b",
  637. Permission: true,
  638. ExpectedResponse: &poll.Metadata{
  639. PollID: testutils.GetPollID(),
  640. UserID: "b",
  641. AdminPermission: true,
  642. VotedAnswers: []string{"Answer 2", "Answer 3"},
  643. },
  644. },
  645. "Voted two Answers, with progress option": {
  646. Poll: poll.Poll{
  647. ID: testutils.GetPollID(),
  648. AnswerOptions: []*poll.AnswerOption{
  649. {Answer: "Answer 1", Voter: []string{"a"}},
  650. {Answer: "Answer 2", Voter: []string{"a", "b"}},
  651. {Answer: "Answer 3", Voter: []string{"b"}},
  652. },
  653. Settings: poll.Settings{
  654. Progress: true,
  655. },
  656. },
  657. UserID: "b",
  658. Permission: true,
  659. ExpectedResponse: &poll.Metadata{
  660. PollID: testutils.GetPollID(),
  661. UserID: "b",
  662. AdminPermission: true,
  663. VotedAnswers: []string{"Answer 2 (2)", "Answer 3 (1)"},
  664. },
  665. },
  666. "Voted no Answers": {
  667. Poll: poll.Poll{
  668. ID: testutils.GetPollID(),
  669. AnswerOptions: []*poll.AnswerOption{
  670. {Answer: "Answer 1", Voter: []string{"a"}},
  671. {Answer: "Answer 2", Voter: []string{"b"}},
  672. {Answer: "Answer 3", Voter: []string{"b"}},
  673. },
  674. },
  675. UserID: "c",
  676. Permission: true,
  677. ExpectedResponse: &poll.Metadata{
  678. PollID: testutils.GetPollID(),
  679. UserID: "c",
  680. AdminPermission: true,
  681. VotedAnswers: []string{},
  682. }},
  683. "Invalid userID": {
  684. Poll: poll.Poll{
  685. ID: testutils.GetPollID(),
  686. AnswerOptions: []*poll.AnswerOption{
  687. {Answer: "Answer 1", Voter: []string{"a"}},
  688. {Answer: "Answer 2", Voter: []string{"b"}},
  689. {Answer: "Answer 3", Voter: []string{"b"}},
  690. },
  691. },
  692. UserID: "",
  693. ExpectedResponse: &poll.Metadata{
  694. PollID: testutils.GetPollID(),
  695. UserID: "",
  696. AdminPermission: false,
  697. VotedAnswers: []string{},
  698. },
  699. },
  700. } {
  701. t.Run(name, func(t *testing.T) {
  702. assert := assert.New(t)
  703. metadata := test.Poll.GetMetadata(test.UserID, test.Permission)
  704. assert.Equal(test.ExpectedResponse, metadata)
  705. })
  706. }
  707. }
  708. func TestHasVoted(t *testing.T) {
  709. p1 := &poll.Poll{Question: "Question",
  710. AnswerOptions: []*poll.AnswerOption{
  711. {Answer: "Answer 1", Voter: []string{"a"}},
  712. {Answer: "Answer 2"},
  713. },
  714. }
  715. assert.True(t, p1.HasVoted("a"))
  716. assert.False(t, p1.HasVoted("b"))
  717. }
  718. func TestPollCopy(t *testing.T) {
  719. assert := assert.New(t)
  720. t.Run("no change", func(t *testing.T) {
  721. p := testutils.GetPoll()
  722. p2 := p.Copy()
  723. assert.Equal(p, p2)
  724. })
  725. t.Run("change Question", func(t *testing.T) {
  726. p := testutils.GetPoll()
  727. p2 := p.Copy()
  728. p.Question = "Different question"
  729. assert.NotEqual(p.Question, p2.Question)
  730. assert.NotEqual(p, p2)
  731. assert.Equal(testutils.GetPoll(), p2)
  732. })
  733. t.Run("change AnswerOptions", func(t *testing.T) {
  734. p := testutils.GetPoll()
  735. p2 := p.Copy()
  736. p.AnswerOptions[0].Answer = "abc"
  737. assert.NotEqual(p.AnswerOptions[0].Answer, p2.AnswerOptions[0].Answer)
  738. assert.NotEqual(p, p2)
  739. assert.Equal(testutils.GetPoll(), p2)
  740. })
  741. t.Run("change Voter", func(t *testing.T) {
  742. p := testutils.GetPollWithVotes()
  743. p2 := p.Copy()
  744. msg, err := p.UpdateVote("userID1", 0)
  745. require.Nil(t, msg)
  746. require.NoError(t, err)
  747. assert.NotEqual(p, p2)
  748. assert.Equal(testutils.GetPollWithVotes(), p2)
  749. })
  750. t.Run("change Settings", func(t *testing.T) {
  751. p := testutils.GetPoll()
  752. p2 := p.Copy()
  753. p.Settings.Progress = true
  754. assert.NotEqual(p.Settings.Progress, p2.Settings.Progress)
  755. assert.NotEqual(p, p2)
  756. assert.Equal(testutils.GetPoll(), p2)
  757. })
  758. }