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.

255 lines
6.4 KiB

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