Encrypted messaging app
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

256 lines
6.4 KiB

2 years ago
2 years ago
2 years ago
  1. package Messages_test
  2. import (
  3. "encoding/base64"
  4. "encoding/json"
  5. "fmt"
  6. "io/ioutil"
  7. "net/http"
  8. "testing"
  9. "git.tovijaeschke.xyz/tovi/Envelope/Backend/Database"
  10. "git.tovijaeschke.xyz/tovi/Envelope/Backend/Database/Seeder"
  11. "git.tovijaeschke.xyz/tovi/Envelope/Backend/Models"
  12. "git.tovijaeschke.xyz/tovi/Envelope/Backend/Tests"
  13. )
  14. func Test_ConversationsList(t *testing.T) {
  15. client, ts, err := Tests.InitTestEnv()
  16. if err != nil {
  17. t.Errorf("Expected nil, recieved %s", err.Error())
  18. return
  19. }
  20. u, err := Database.GetUserByUsername("test")
  21. key, err := Seeder.GenerateAesKey()
  22. if err != nil {
  23. t.Errorf("Expected nil, recieved %s", err.Error())
  24. return
  25. }
  26. nameCiphertext, err := key.AesEncrypt([]byte("Test conversation"))
  27. if err != nil {
  28. t.Errorf("Expected nil, recieved %s", err.Error())
  29. return
  30. }
  31. twoUserCiphertext, err := key.AesEncrypt([]byte("false"))
  32. if err != nil {
  33. t.Errorf("Expected nil, recieved %s", err.Error())
  34. return
  35. }
  36. messageThread := Models.ConversationDetail{
  37. Name: base64.StdEncoding.EncodeToString(nameCiphertext),
  38. TwoUser: base64.StdEncoding.EncodeToString(twoUserCiphertext),
  39. }
  40. err = Database.CreateConversationDetail(&messageThread)
  41. if err != nil {
  42. t.Errorf("Expected nil, recieved %s", err.Error())
  43. return
  44. }
  45. conversationDetailIDCiphertext, err := key.AesEncrypt([]byte(messageThread.ID.String()))
  46. if err != nil {
  47. t.Errorf("Expected nil, recieved %s", err.Error())
  48. return
  49. }
  50. adminCiphertext, err := key.AesEncrypt([]byte("true"))
  51. if err != nil {
  52. t.Errorf("Expected nil, recieved %s", err.Error())
  53. return
  54. }
  55. pubKey := Seeder.GetPubKey()
  56. messageThreadUser := Models.UserConversation{
  57. UserID: u.ID,
  58. ConversationDetailID: base64.StdEncoding.EncodeToString(conversationDetailIDCiphertext),
  59. Admin: base64.StdEncoding.EncodeToString(adminCiphertext),
  60. SymmetricKey: base64.StdEncoding.EncodeToString(
  61. Seeder.EncryptWithPublicKey(key.Key, pubKey),
  62. ),
  63. }
  64. err = Database.CreateUserConversation(&messageThreadUser)
  65. req, _ := http.NewRequest("GET", ts.URL+"/api/v1/auth/conversations", nil)
  66. resp, err := client.Do(req)
  67. if err != nil {
  68. t.Errorf("Expected nil, recieved %s", err.Error())
  69. return
  70. }
  71. if resp.StatusCode != http.StatusOK {
  72. t.Errorf("Expected %d, recieved %d", http.StatusOK, resp.StatusCode)
  73. return
  74. }
  75. requestBody, err := ioutil.ReadAll(resp.Body)
  76. if err != nil {
  77. t.Errorf("Expected %d, recieved %d", http.StatusOK, resp.StatusCode)
  78. return
  79. }
  80. var conversations []Models.UserConversation
  81. json.Unmarshal(requestBody, &conversations)
  82. if len(conversations) != 1 {
  83. t.Errorf("Expected %d, recieved %d", 1, len(conversations))
  84. return
  85. }
  86. conv := conversations[0]
  87. decodedId, err := base64.StdEncoding.DecodeString(conv.ConversationDetailID)
  88. if err != nil {
  89. t.Errorf("Expected %d, recieved %d", http.StatusOK, resp.StatusCode)
  90. return
  91. }
  92. decrypedId, err := key.AesDecrypt(decodedId)
  93. if err != nil {
  94. t.Errorf("Expected %d, recieved %d", http.StatusOK, resp.StatusCode)
  95. return
  96. }
  97. req, _ = http.NewRequest(
  98. "GET",
  99. ts.URL+"/api/v1/auth/conversation_details?conversation_detail_ids="+string(decrypedId),
  100. nil,
  101. )
  102. resp, err = client.Do(req)
  103. if err != nil {
  104. t.Errorf("Expected nil, recieved %s", err.Error())
  105. return
  106. }
  107. var conversationDetails []Models.ConversationDetail
  108. requestBody, err = ioutil.ReadAll(resp.Body)
  109. if err != nil {
  110. t.Errorf("Expected %d, recieved %d", http.StatusOK, resp.StatusCode)
  111. return
  112. }
  113. json.Unmarshal(requestBody, &conversationDetails)
  114. if len(conversationDetails) != 1 {
  115. t.Errorf("Expected %d, recieved %d", 1, len(conversations))
  116. }
  117. decodedName, err := base64.StdEncoding.DecodeString(conversationDetails[0].Name)
  118. if err != nil {
  119. t.Errorf("Expected %d, recieved %d", http.StatusOK, resp.StatusCode)
  120. return
  121. }
  122. decrypedName, err := key.AesDecrypt(decodedName)
  123. if err != nil {
  124. t.Errorf("Expected %d, recieved %d", http.StatusOK, resp.StatusCode)
  125. return
  126. }
  127. if string(decrypedName) != "Test conversation" {
  128. t.Errorf("Expected %s, recieved %s", "Test converation", string(decrypedName))
  129. }
  130. }
  131. func Test_ConversationsListPagination(t *testing.T) {
  132. client, ts, err := Tests.InitTestEnv()
  133. if err != nil {
  134. t.Errorf("Expected nil, recieved %s", err.Error())
  135. return
  136. }
  137. u, err := Database.GetUserByUsername("test")
  138. key, err := Seeder.GenerateAesKey()
  139. if err != nil {
  140. t.Errorf("Expected nil, recieved %s", err.Error())
  141. return
  142. }
  143. for i := 0; i < 40; i++ {
  144. nameCiphertext, err := key.AesEncrypt([]byte(
  145. fmt.Sprintf("Test conversation %d", i),
  146. ))
  147. if err != nil {
  148. t.Errorf("Expected nil, recieved %s", err.Error())
  149. return
  150. }
  151. twoUserCiphertext, err := key.AesEncrypt([]byte("false"))
  152. if err != nil {
  153. t.Errorf("Expected nil, recieved %s", err.Error())
  154. return
  155. }
  156. messageThread := Models.ConversationDetail{
  157. Name: base64.StdEncoding.EncodeToString(nameCiphertext),
  158. TwoUser: base64.StdEncoding.EncodeToString(twoUserCiphertext),
  159. }
  160. err = Database.CreateConversationDetail(&messageThread)
  161. if err != nil {
  162. t.Errorf("Expected nil, recieved %s", err.Error())
  163. return
  164. }
  165. conversationDetailIDCiphertext, err := key.AesEncrypt([]byte(messageThread.ID.String()))
  166. if err != nil {
  167. t.Errorf("Expected nil, recieved %s", err.Error())
  168. return
  169. }
  170. adminCiphertext, err := key.AesEncrypt([]byte("true"))
  171. if err != nil {
  172. t.Errorf("Expected nil, recieved %s", err.Error())
  173. return
  174. }
  175. pubKey := Seeder.GetPubKey()
  176. messageThreadUser := Models.UserConversation{
  177. UserID: u.ID,
  178. ConversationDetailID: base64.StdEncoding.EncodeToString(conversationDetailIDCiphertext),
  179. Admin: base64.StdEncoding.EncodeToString(adminCiphertext),
  180. SymmetricKey: base64.StdEncoding.EncodeToString(
  181. Seeder.EncryptWithPublicKey(key.Key, pubKey),
  182. ),
  183. }
  184. err = Database.CreateUserConversation(&messageThreadUser)
  185. }
  186. req, _ := http.NewRequest("GET", ts.URL+"/api/v1/auth/conversations?page=0", nil)
  187. resp, err := client.Do(req)
  188. if err != nil {
  189. t.Errorf("Expected nil, recieved %s", err.Error())
  190. return
  191. }
  192. if resp.StatusCode != http.StatusOK {
  193. t.Errorf("Expected %d, recieved %d", http.StatusOK, resp.StatusCode)
  194. return
  195. }
  196. requestBody, err := ioutil.ReadAll(resp.Body)
  197. if err != nil {
  198. t.Errorf("Expected %d, recieved %d", http.StatusOK, resp.StatusCode)
  199. return
  200. }
  201. var conversations []Models.UserConversation
  202. json.Unmarshal(requestBody, &conversations)
  203. if len(conversations) != 20 {
  204. t.Errorf("Expected %d, recieved %d", 1, len(conversations))
  205. }
  206. }