main_test.go 20 KB

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