main_test.go 19 KB

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