main_test.go 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883
  1. package main
  2. import (
  3. "encoding/json"
  4. "flag"
  5. "fmt"
  6. "github.com/Jinnrry/pmail/db"
  7. "github.com/Jinnrry/pmail/dto/response"
  8. "github.com/Jinnrry/pmail/models"
  9. "github.com/Jinnrry/pmail/services/setup"
  10. "github.com/Jinnrry/pmail/signal"
  11. "github.com/Jinnrry/pmail/utils/array"
  12. "github.com/spf13/cast"
  13. "io"
  14. "net"
  15. "net/http"
  16. "net/http/cookiejar"
  17. "os"
  18. "strconv"
  19. "strings"
  20. "testing"
  21. "time"
  22. )
  23. var httpClient *http.Client
  24. const TestPort = 17888
  25. var TestHost string = "http://127.0.0.1:" + cast.ToString(TestPort)
  26. func TestMain(m *testing.M) {
  27. cookeieJar, err := cookiejar.New(nil)
  28. if err != nil {
  29. panic(err)
  30. }
  31. httpClient = &http.Client{Jar: cookeieJar, Timeout: 5 * time.Minute}
  32. os.Remove("config/config.json")
  33. os.Remove("config/pmail_temp.db")
  34. go func() {
  35. main()
  36. }()
  37. time.Sleep(3 * time.Second)
  38. m.Run()
  39. signal.StopChan <- true
  40. time.Sleep(3 * time.Second)
  41. }
  42. func TestMaster(t *testing.T) {
  43. t.Run("TestPort", testPort)
  44. t.Run("testDataBaseSet", testDataBaseSet)
  45. t.Run("testPwdSet", testPwdSet)
  46. t.Run("testDomainSet", testDomainSet)
  47. t.Run("testDNSSet", testDNSSet)
  48. cfg, err := setup.ReadConfig()
  49. if err != nil {
  50. t.Fatal(err)
  51. }
  52. cfg.HttpsEnabled = 2
  53. cfg.HttpPort = TestPort
  54. err = setup.WriteConfig(cfg)
  55. if err != nil {
  56. t.Fatal(err)
  57. }
  58. t.Run("testSSLSet", testSSLSet)
  59. time.Sleep(8 * time.Second)
  60. t.Run("testLogin", testLogin) // 登录管理员账号
  61. t.Run("testCreateUser", testCreateUser) // 创建3个测试用户
  62. t.Run("testEditUser", testEditUser) // 编辑user2,封禁user3
  63. t.Run("testSendEmail", testSendEmail)
  64. time.Sleep(8 * time.Second)
  65. t.Run("testEmailList", testEmailList)
  66. t.Run("testGetDetail", testGetEmailDetail)
  67. t.Run("testDelEmail", testDelEmail)
  68. t.Run("testSendEmail2User1", testSendEmail2User1)
  69. t.Run("testSendEmail2User2", testSendEmail2User2)
  70. t.Run("testSendEmail2User3", testSendEmail2User3)
  71. time.Sleep(8 * time.Second)
  72. t.Run("testLoginUser3", testLoginUser3) // 测试登录被封禁账号
  73. t.Run("testLoginUser2", testLoginUser2) // 测试登录普通账号
  74. t.Run("testUser2EmailList", testUser2EmailList)
  75. // 创建group
  76. t.Run("testCreateGroup", testCreateGroup)
  77. // 创建rule
  78. t.Run("testCreateRule", testCreateRule)
  79. // 再次发邮件
  80. t.Run("testMoverEmailSend", testSendEmail2User2ForMove)
  81. time.Sleep(4 * time.Second)
  82. t.Run("testMoverEmailSend", testSendEmail2User2ForSpam)
  83. time.Sleep(3 * time.Second)
  84. // 检查规则执行
  85. t.Run("testCheckRule", testCheckRule)
  86. time.Sleep(3 * time.Second)
  87. }
  88. func testCheckRule(t *testing.T) {
  89. var ue models.UserEmail
  90. db.Instance.Where("group_id!=0").Get(&ue)
  91. if ue.GroupId == 0 {
  92. t.Error("邮件规则执行失败!")
  93. }
  94. }
  95. func testGetEmailDetail(t *testing.T) {
  96. ret, err := httpClient.Post(TestHost+"/api/email/detail", "application/json", strings.NewReader(`{
  97. "id":1
  98. }`))
  99. if err != nil {
  100. t.Error(err)
  101. }
  102. data, err := readResponse(ret.Body)
  103. if err != nil {
  104. t.Error(err)
  105. }
  106. if data.ErrorNo != 0 {
  107. t.Error("GetEmailDetail Error! ", data)
  108. }
  109. }
  110. func testCreateRule(t *testing.T) {
  111. ret, err := httpClient.Post(TestHost+"/api/rule/add", "application/json", strings.NewReader(`{
  112. "name":"Move Group",
  113. "rules":[{"field":"Subject","type":"contains","rule":"Move"}],
  114. "action":4,
  115. "params":"1",
  116. "sort":1
  117. }`))
  118. if err != nil {
  119. t.Error(err)
  120. }
  121. data, err := readResponse(ret.Body)
  122. if err != nil {
  123. t.Error(err)
  124. }
  125. if data.ErrorNo != 0 {
  126. t.Error("CreateRule Api Error!", data)
  127. }
  128. ret, err = httpClient.Post(TestHost+"/api/rule/get", "application/json", strings.NewReader(`{}`))
  129. if err != nil {
  130. t.Error(err)
  131. }
  132. data, err = readResponse(ret.Body)
  133. if err != nil {
  134. t.Error(err)
  135. }
  136. if data.ErrorNo != 0 {
  137. t.Error("CreateRule Api Error!", data)
  138. }
  139. dt := data.Data.([]any)
  140. if len(dt) != 1 {
  141. t.Error("Rule List Is Empty!")
  142. }
  143. }
  144. func testCreateGroup(t *testing.T) {
  145. ret, err := httpClient.Post(TestHost+"/api/group/add", "application/json", strings.NewReader(`{
  146. "name":"TestGroup"
  147. }`))
  148. if err != nil {
  149. t.Error(err)
  150. }
  151. data, err := readResponse(ret.Body)
  152. if err != nil {
  153. t.Error(err)
  154. }
  155. if data.ErrorNo != 0 {
  156. t.Error("CreateGroup Api Error!", data)
  157. }
  158. ret, err = httpClient.Post(TestHost+"/api/group/list", "application/json", strings.NewReader(`{}`))
  159. if err != nil {
  160. t.Error(err)
  161. }
  162. data, err = readResponse(ret.Body)
  163. if err != nil {
  164. t.Error(err)
  165. }
  166. if data.ErrorNo != 0 {
  167. t.Error("CreateGroup Api Error!", data)
  168. }
  169. dt := data.Data.([]any)
  170. if len(dt) != 1 {
  171. t.Error("Group List Is Empty!")
  172. }
  173. }
  174. func testEditUser(t *testing.T) {
  175. ret, err := httpClient.Post(TestHost+"/api/user/edit", "application/json", strings.NewReader(`{
  176. "account":"user2",
  177. "username":"user2New",
  178. "password":"user2New"
  179. }`))
  180. if err != nil {
  181. t.Error(err)
  182. }
  183. data, err := readResponse(ret.Body)
  184. if err != nil {
  185. t.Error(err)
  186. }
  187. if data.ErrorNo != 0 {
  188. t.Error("Edit User Api Error!", data)
  189. }
  190. ret, err = httpClient.Post(TestHost+"/api/user/edit", "application/json", strings.NewReader(`{
  191. "account":"user3",
  192. "disabled": 1
  193. }`))
  194. if err != nil {
  195. t.Error(err)
  196. }
  197. data, err = readResponse(ret.Body)
  198. if err != nil {
  199. t.Error(err)
  200. }
  201. if data.ErrorNo != 0 {
  202. t.Error("Edit User Api Error!", data)
  203. }
  204. }
  205. func testCreateUser(t *testing.T) {
  206. ret, err := httpClient.Post(TestHost+"/api/user/create", "application/json", strings.NewReader(`{
  207. "account":"user1",
  208. "username":"user1",
  209. "password":"user1"
  210. }`))
  211. if err != nil {
  212. t.Error(err)
  213. }
  214. data, err := readResponse(ret.Body)
  215. if err != nil {
  216. t.Error(err)
  217. }
  218. if data.ErrorNo != 0 {
  219. t.Error(data)
  220. t.Error("Create User Api Error!")
  221. }
  222. ret, err = httpClient.Post(TestHost+"/api/user/create", "application/json", strings.NewReader(`{
  223. "account":"user2",
  224. "username":"user2",
  225. "password":"user2"
  226. }`))
  227. if err != nil {
  228. t.Error(err)
  229. }
  230. data, err = readResponse(ret.Body)
  231. if err != nil {
  232. t.Error(err)
  233. }
  234. if data.ErrorNo != 0 {
  235. t.Error("Create User Api Error!")
  236. }
  237. ret, err = httpClient.Post(TestHost+"/api/user/create", "application/json", strings.NewReader(`{
  238. "account":"user3",
  239. "username":"user3",
  240. "password":"user3"
  241. }`))
  242. if err != nil {
  243. t.Error(err)
  244. }
  245. data, err = readResponse(ret.Body)
  246. if err != nil {
  247. t.Error(err)
  248. }
  249. if data.ErrorNo != 0 {
  250. t.Error("Create User Api Error!")
  251. }
  252. }
  253. func testPort(t *testing.T) {
  254. if !portCheck(TestPort) {
  255. t.Error("port check failed")
  256. }
  257. t.Log("port check passed")
  258. }
  259. func testDataBaseSet(t *testing.T) {
  260. // 获取配置
  261. ret, err := http.Post(TestHost+"/api/setup", "application/json", strings.NewReader("{\"action\":\"get\",\"step\":\"database\"}"))
  262. if err != nil {
  263. t.Error(err)
  264. }
  265. data, err := readResponse(ret.Body)
  266. if err != nil {
  267. t.Error(err)
  268. }
  269. if data.ErrorNo != 0 {
  270. t.Error("Get Database Config Api Error!")
  271. }
  272. argList := flag.Args()
  273. configData := `
  274. {"action":"set","step":"database","db_type":"sqlite","db_dsn":"./config/pmail_temp.db"}
  275. `
  276. if array.InArray("mysql", argList) {
  277. configData = `
  278. {"action":"set","step":"database","db_type":"mysql","db_dsn":"root:githubTest@tcp(mysql:3306)/pmail?parseTime=True"}
  279. `
  280. } else if array.InArray("postgres", argList) {
  281. configData = `
  282. {"action":"set","step":"database","db_type":"postgres","db_dsn":"postgres://postgres:githubTest@127.0.0.1:5432/pmail?sslmode=disable"}
  283. `
  284. }
  285. // 设置配置
  286. ret, err = http.Post(TestHost+"/api/setup", "application/json", strings.NewReader(configData))
  287. if err != nil {
  288. t.Error(err)
  289. }
  290. data, err = readResponse(ret.Body)
  291. if err != nil {
  292. t.Error(err)
  293. }
  294. if data.ErrorNo != 0 {
  295. t.Error("Get Database Config Api Error!")
  296. }
  297. // 获取配置
  298. ret, err = http.Post(TestHost+"/api/setup", "application/json", strings.NewReader("{\"action\":\"get\",\"step\":\"database\"}"))
  299. if err != nil {
  300. t.Error(err)
  301. }
  302. data, err = readResponse(ret.Body)
  303. if err != nil {
  304. t.Error(err)
  305. }
  306. if data.ErrorNo != 0 {
  307. t.Error("Get Database Config Api Error!")
  308. }
  309. dt := data.Data.(map[string]interface{})
  310. if cast.ToString(dt["db_dsn"]) == "" {
  311. t.Error("Check Database Config Api Error!")
  312. }
  313. t.Log("Database Config Api Success!")
  314. }
  315. func testPwdSet(t *testing.T) {
  316. // 获取配置
  317. ret, err := http.Post(TestHost+"/api/setup", "application/json", strings.NewReader("{\"action\":\"get\",\"step\":\"password\"}"))
  318. if err != nil {
  319. t.Error(err)
  320. }
  321. data, err := readResponse(ret.Body)
  322. if err != nil {
  323. t.Error(err)
  324. }
  325. if data.ErrorNo != 0 {
  326. t.Error("Get Password Config Api Error!")
  327. }
  328. // 设置配置
  329. ret, err = http.Post(TestHost+"/api/setup", "application/json", strings.NewReader(`
  330. {"action":"set","step":"password","account":"testCase","password":"testCase"}
  331. `))
  332. if err != nil {
  333. t.Error(err)
  334. }
  335. data, err = readResponse(ret.Body)
  336. if err != nil {
  337. t.Error(err)
  338. }
  339. if data.ErrorNo != 0 {
  340. t.Error("Set Password Config Api Error!")
  341. t.Error(data)
  342. }
  343. // 获取配置
  344. ret, err = http.Post(TestHost+"/api/setup", "application/json", strings.NewReader("{\"action\":\"get\",\"step\":\"password\"}"))
  345. if err != nil {
  346. t.Error(err)
  347. }
  348. data, err = readResponse(ret.Body)
  349. if err != nil {
  350. t.Error(err)
  351. }
  352. if data.ErrorNo != 0 {
  353. t.Error("Get Password Config Api Error!")
  354. }
  355. if cast.ToString(data.Data) != "testCase" {
  356. t.Error("Check Password Config Api Error!")
  357. }
  358. t.Log("Password Config Api Success!")
  359. }
  360. func testDomainSet(t *testing.T) {
  361. // 获取配置
  362. ret, err := http.Post(TestHost+"/api/setup", "application/json", strings.NewReader("{\"action\":\"get\",\"step\":\"domain\"}"))
  363. if err != nil {
  364. t.Error(err)
  365. }
  366. data, err := readResponse(ret.Body)
  367. if err != nil {
  368. t.Error(err)
  369. }
  370. if data.ErrorNo != 0 {
  371. t.Error("Get domain Config Api Error!")
  372. }
  373. // 设置配置
  374. ret, err = http.Post(TestHost+"/api/setup", "application/json", strings.NewReader(`
  375. {"action":"set","step":"domain","smtp_domain":"test.domain","web_domain":"mail.test.domain"}
  376. `))
  377. if err != nil {
  378. t.Error(err)
  379. }
  380. data, err = readResponse(ret.Body)
  381. if err != nil {
  382. t.Error(err)
  383. }
  384. if data.ErrorNo != 0 {
  385. t.Error("Set domain Config Api Error!")
  386. }
  387. // 获取配置
  388. ret, err = http.Post(TestHost+"/api/setup", "application/json", strings.NewReader("{\"action\":\"get\",\"step\":\"domain\"}"))
  389. if err != nil {
  390. t.Error(err)
  391. }
  392. data, err = readResponse(ret.Body)
  393. if err != nil {
  394. t.Error(err)
  395. }
  396. if data.ErrorNo != 0 {
  397. t.Error("Get Password Config Api Error!")
  398. }
  399. dt := data.Data.(map[string]interface{})
  400. if cast.ToString(dt["smtp_domain"]) != "test.domain" {
  401. t.Error("Check domain Config Api Error!")
  402. }
  403. if cast.ToString(dt["web_domain"]) != "mail.test.domain" {
  404. t.Error("Check domain Config Api Error!")
  405. }
  406. t.Log("domain Config Api Success!")
  407. }
  408. func testDNSSet(t *testing.T) {
  409. // 获取配置
  410. ret, err := http.Post(TestHost+"/api/setup", "application/json", strings.NewReader("{\"action\":\"get\",\"step\":\"dns\"}"))
  411. if err != nil {
  412. t.Error(err)
  413. }
  414. data, err := readResponse(ret.Body)
  415. if err != nil {
  416. t.Error(err)
  417. }
  418. if data.ErrorNo != 0 {
  419. t.Error("Get domain Config Api Error!")
  420. }
  421. t.Log("DNS Set Success!")
  422. }
  423. func testSSLSet(t *testing.T) {
  424. // 获取配置
  425. ret, err := http.Post(TestHost+"/api/setup", "application/json", strings.NewReader("{\"action\":\"get\",\"step\":\"ssl\"}"))
  426. if err != nil {
  427. t.Error(err)
  428. }
  429. data, err := readResponse(ret.Body)
  430. if err != nil {
  431. t.Error(err)
  432. }
  433. if data.ErrorNo != 0 {
  434. t.Error("Get domain Config Api Error!")
  435. }
  436. // 设置配置
  437. ret, err = http.Post(TestHost+"/api/setup", "application/json", strings.NewReader(`
  438. {"action":"set","step":"ssl","ssl_type":"1","key_path":"./config/ssl/private.key","crt_path":"./config/ssl/public.crt"}
  439. `))
  440. if err != nil {
  441. t.Error(err)
  442. }
  443. data, err = readResponse(ret.Body)
  444. if err != nil {
  445. t.Error(err)
  446. }
  447. if data.ErrorNo != 0 {
  448. t.Error("Set domain Config Api Error!")
  449. }
  450. t.Log("domain Config Api Success!")
  451. }
  452. func testLogin(t *testing.T) {
  453. ret, err := httpClient.Post(TestHost+"/api/login", "application/json", strings.NewReader("{\"account\":\"testCase\",\"password\":\"testCase\"}"))
  454. if err != nil {
  455. t.Error(err)
  456. }
  457. data, err := readResponse(ret.Body)
  458. if err != nil {
  459. t.Error(err)
  460. }
  461. if data.ErrorNo != 0 {
  462. t.Error("Login Api Error!")
  463. }
  464. t.Logf("testLogin Success! Response: %+v", data)
  465. }
  466. func testLoginUser2(t *testing.T) {
  467. ret, err := httpClient.Post(TestHost+"/api/login", "application/json", strings.NewReader("{\"account\":\"user2\",\"password\":\"user2New\"}"))
  468. if err != nil {
  469. t.Error(err)
  470. }
  471. data, err := readResponse(ret.Body)
  472. if err != nil {
  473. t.Error(err)
  474. }
  475. if data.ErrorNo != 0 {
  476. t.Error("Login User2 Api Error!", data)
  477. }
  478. t.Logf("testLoginUser2 Success! Response: %+v", data)
  479. }
  480. func testLoginUser3(t *testing.T) {
  481. ret, err := httpClient.Post(TestHost+"/api/login", "application/json", strings.NewReader("{\"account\":\"user3\",\"password\":\"user3\"}"))
  482. if err != nil {
  483. t.Error(err)
  484. }
  485. data, err := readResponse(ret.Body)
  486. if err != nil {
  487. t.Error(err)
  488. }
  489. if data.ErrorNo != 100 {
  490. t.Error("Login User3 Api Error!", data)
  491. }
  492. t.Logf("testLoginUser3 Success! Response: %+v", data)
  493. }
  494. func testSendEmail(t *testing.T) {
  495. ret, err := httpClient.Post(TestHost+"/api/email/send", "application/json", strings.NewReader(`
  496. {
  497. "from": {
  498. "name": "i",
  499. "email": "i@test.domain"
  500. },
  501. "to": [
  502. {
  503. "name": "y",
  504. "email": "y@test.domain"
  505. }
  506. ],
  507. "cc": [
  508. ],
  509. "subject": "Title",
  510. "text": "text",
  511. "html": "<div>text</div>"
  512. }
  513. `))
  514. if err != nil {
  515. t.Error(err)
  516. }
  517. data, err := readResponse(ret.Body)
  518. if err != nil {
  519. t.Error(err)
  520. }
  521. if data.ErrorNo != 0 {
  522. t.Error("Send Email Api Error!")
  523. }
  524. t.Logf("testSendEmail Success! Response: %+v", data)
  525. }
  526. func testSendEmail2User2ForSpam(t *testing.T) {
  527. ret, err := httpClient.Post(TestHost+"/api/email/send", "application/json", strings.NewReader(`
  528. {
  529. "from": {
  530. "name": "user2",
  531. "email": "user2@test.domain"
  532. },
  533. "to": [
  534. {
  535. "name": "y",
  536. "email": "admin@test.domain"
  537. }
  538. ],
  539. "cc": [
  540. ],
  541. "subject": "spam",
  542. "text": "NeedMove",
  543. "html": "<div>text</div>"
  544. }
  545. `))
  546. if err != nil {
  547. t.Error(err)
  548. }
  549. data, err := readResponse(ret.Body)
  550. if err != nil {
  551. t.Error(err)
  552. }
  553. if data.ErrorNo != 0 {
  554. t.Error("Send Email Api Error!")
  555. }
  556. t.Logf("testSendEmail2User2ForMove Success! Response: %+v", data)
  557. }
  558. func testSendEmail2User2ForMove(t *testing.T) {
  559. ret, err := httpClient.Post(TestHost+"/api/email/send", "application/json", strings.NewReader(`
  560. {
  561. "from": {
  562. "name": "user2",
  563. "email": "user2@test.domain"
  564. },
  565. "to": [
  566. {
  567. "name": "y",
  568. "email": "user2@test.domain"
  569. }
  570. ],
  571. "cc": [
  572. ],
  573. "subject": "MovePlease",
  574. "text": "NeedMove",
  575. "html": "<div>text</div>"
  576. }
  577. `))
  578. if err != nil {
  579. t.Error(err)
  580. }
  581. data, err := readResponse(ret.Body)
  582. if err != nil {
  583. t.Error(err)
  584. }
  585. if data.ErrorNo != 0 {
  586. t.Error("Send Email Api Error!")
  587. }
  588. t.Logf("testSendEmail2User2ForMove Success! Response: %+v", data)
  589. }
  590. func testSendEmail2User1(t *testing.T) {
  591. ret, err := httpClient.Post(TestHost+"/api/email/send", "application/json", strings.NewReader(`
  592. {
  593. "from": {
  594. "name": "i",
  595. "email": "i@test.domain"
  596. },
  597. "to": [
  598. {
  599. "name": "y",
  600. "email": "user1@test.domain"
  601. }
  602. ],
  603. "cc": [
  604. ],
  605. "subject": "HelloUser1",
  606. "text": "text",
  607. "html": "<div>text</div>"
  608. }
  609. `))
  610. if err != nil {
  611. t.Error(err)
  612. }
  613. data, err := readResponse(ret.Body)
  614. if err != nil {
  615. t.Error(err)
  616. }
  617. if data.ErrorNo != 0 {
  618. t.Error("Send Email Api Error!")
  619. }
  620. t.Logf("testSendEmail2User1 Success! Response: %+v", data)
  621. }
  622. func testSendEmail2User2(t *testing.T) {
  623. ret, err := httpClient.Post(TestHost+"/api/email/send", "application/json", strings.NewReader(`
  624. {
  625. "from": {
  626. "name": "i",
  627. "email": "i@test.domain"
  628. },
  629. "to": [
  630. {
  631. "name": "y",
  632. "email": "user2@test.domain"
  633. }
  634. ],
  635. "cc": [
  636. ],
  637. "subject": "HelloUser2",
  638. "text": "text",
  639. "html": "<div>text</div>"
  640. }
  641. `))
  642. if err != nil {
  643. t.Error(err)
  644. }
  645. data, err := readResponse(ret.Body)
  646. if err != nil {
  647. t.Error(err)
  648. }
  649. if data.ErrorNo != 0 {
  650. t.Error("Send Email Api Error!")
  651. }
  652. t.Logf("testSendEmail2User2 Success! Response: %+v", data)
  653. }
  654. func testSendEmail2User3(t *testing.T) {
  655. ret, err := httpClient.Post(TestHost+"/api/email/send", "application/json", strings.NewReader(`
  656. {
  657. "from": {
  658. "name": "i",
  659. "email": "i@test.domain"
  660. },
  661. "to": [
  662. {
  663. "name": "y",
  664. "email": "user3@test.domain"
  665. }
  666. ],
  667. "cc": [
  668. ],
  669. "subject": "HelloUser3",
  670. "text": "text",
  671. "html": "<div>text</div>"
  672. }
  673. `))
  674. if err != nil {
  675. t.Error(err)
  676. }
  677. data, err := readResponse(ret.Body)
  678. if err != nil {
  679. t.Error(err)
  680. }
  681. if data.ErrorNo != 0 {
  682. t.Error("Send Email Api Error!")
  683. }
  684. t.Logf("testSendEmail2User3 Success! Response: %+v", data)
  685. }
  686. func testEmailList(t *testing.T) {
  687. ret, err := httpClient.Post(TestHost+"/api/email/list", "application/json", strings.NewReader(`{}`))
  688. if err != nil {
  689. t.Error(err)
  690. }
  691. data, err := readResponse(ret.Body)
  692. if err != nil {
  693. t.Error(err)
  694. }
  695. if data.ErrorNo != 0 {
  696. t.Error("Get Email List Api Error!")
  697. }
  698. dt := data.Data.(map[string]interface{})
  699. if dt["list"] == nil || len(dt["list"].([]interface{})) == 0 {
  700. t.Error("Email List Is Empty!")
  701. return
  702. }
  703. lst := dt["list"].([]interface{})
  704. item := lst[0].(map[string]interface{})
  705. id := cast.ToInt(item["id"])
  706. if id == 0 {
  707. t.Error("Email List Data Error!")
  708. }
  709. t.Logf("testEmailList Success! Response: %+v", data)
  710. }
  711. func testUser2EmailList(t *testing.T) {
  712. ret, err := httpClient.Post(TestHost+"/api/email/list", "application/json", strings.NewReader(`{}`))
  713. if err != nil {
  714. t.Error(err)
  715. }
  716. data, err := readResponse(ret.Body)
  717. if err != nil {
  718. t.Error(err)
  719. }
  720. if data.ErrorNo != 0 {
  721. t.Error("Get Email List Api Error!")
  722. }
  723. dt := data.Data.(map[string]interface{})
  724. if dt["list"] == nil || len(dt["list"].([]interface{})) != 1 {
  725. t.Error("Email List Is Empty!")
  726. }
  727. t.Logf("testUser2EmailList Success! Response: %+v", data)
  728. }
  729. func testDelEmail(t *testing.T) {
  730. ret, err := httpClient.Post(TestHost+"/api/email/list", "application/json", strings.NewReader(`{}`))
  731. if err != nil {
  732. t.Error(err)
  733. }
  734. data, err := readResponse(ret.Body)
  735. if err != nil {
  736. t.Error(err)
  737. }
  738. if data.ErrorNo != 0 {
  739. t.Error("Get Email List Api Error!")
  740. }
  741. dt := data.Data.(map[string]interface{})
  742. if len(dt["list"].([]interface{})) == 0 {
  743. t.Error("Email List Is Empty!")
  744. }
  745. lst := dt["list"].([]interface{})
  746. item := lst[0].(map[string]interface{})
  747. id := cast.ToInt(item["id"])
  748. ret, err = httpClient.Post(TestHost+"/api/email/del", "application/json", strings.NewReader(fmt.Sprintf(`{
  749. "ids":[%d]
  750. }`, id)))
  751. if err != nil {
  752. t.Error(err)
  753. }
  754. data, err = readResponse(ret.Body)
  755. if err != nil {
  756. t.Error(err)
  757. }
  758. if data.ErrorNo != 0 {
  759. t.Error("Email Delete Api Error!")
  760. }
  761. var mail models.UserEmail
  762. db.Instance.Where("email_id = ?", id).Get(&mail)
  763. if mail.Status != 3 {
  764. t.Error("Email Delete Api Error!")
  765. }
  766. t.Logf("testDelEmail Success! Response: %+v", data)
  767. }
  768. // portCheck 检查端口是占用
  769. func portCheck(port int) bool {
  770. l, err := net.Listen("tcp", fmt.Sprintf(":%s", strconv.Itoa(port)))
  771. if err != nil {
  772. return true
  773. }
  774. defer l.Close()
  775. return false
  776. }
  777. func readResponse(r io.Reader) (*response.Response, error) {
  778. data, err := io.ReadAll(r)
  779. if err != nil {
  780. return nil, err
  781. }
  782. ret := &response.Response{}
  783. err = json.Unmarshal(data, ret)
  784. if err != nil {
  785. return nil, err
  786. }
  787. return ret, nil
  788. }