main_test.go 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885
  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. } else {
  257. t.Log("port check passed")
  258. }
  259. }
  260. func testDataBaseSet(t *testing.T) {
  261. // 获取配置
  262. ret, err := http.Post(TestHost+"/api/setup", "application/json", strings.NewReader("{\"action\":\"get\",\"step\":\"database\"}"))
  263. if err != nil {
  264. t.Error(err)
  265. }
  266. data, err := readResponse(ret.Body)
  267. if err != nil {
  268. t.Error(err)
  269. }
  270. if data.ErrorNo != 0 {
  271. t.Error("Get Database Config Api Error!")
  272. }
  273. argList := flag.Args()
  274. configData := `
  275. {"action":"set","step":"database","db_type":"sqlite","db_dsn":"./config/pmail_temp.db"}
  276. `
  277. if array.InArray("mysql", argList) {
  278. configData = `
  279. {"action":"set","step":"database","db_type":"mysql","db_dsn":"root:githubTest@tcp(mysql:3306)/pmail?parseTime=True"}
  280. `
  281. } else if array.InArray("postgres", argList) {
  282. configData = `
  283. {"action":"set","step":"database","db_type":"postgres","db_dsn":"postgres://postgres:githubTest@127.0.0.1:5432/pmail?sslmode=disable"}
  284. `
  285. }
  286. // 设置配置
  287. ret, err = http.Post(TestHost+"/api/setup", "application/json", strings.NewReader(configData))
  288. if err != nil {
  289. t.Error(err)
  290. }
  291. data, err = readResponse(ret.Body)
  292. if err != nil {
  293. t.Error(err)
  294. }
  295. if data.ErrorNo != 0 {
  296. t.Error("Get Database Config Api Error!")
  297. }
  298. // 获取配置
  299. ret, err = http.Post(TestHost+"/api/setup", "application/json", strings.NewReader("{\"action\":\"get\",\"step\":\"database\"}"))
  300. if err != nil {
  301. t.Error(err)
  302. }
  303. data, err = readResponse(ret.Body)
  304. if err != nil {
  305. t.Error(err)
  306. }
  307. if data.ErrorNo != 0 {
  308. t.Error("Get Database Config Api Error!")
  309. }
  310. dt := data.Data.(map[string]interface{})
  311. if cast.ToString(dt["db_dsn"]) == "" {
  312. t.Error("Check Database Config Api Error!")
  313. }
  314. t.Log("Database Config Api Success!")
  315. }
  316. func testPwdSet(t *testing.T) {
  317. // 获取配置
  318. ret, err := http.Post(TestHost+"/api/setup", "application/json", strings.NewReader("{\"action\":\"get\",\"step\":\"password\"}"))
  319. if err != nil {
  320. t.Error(err)
  321. }
  322. data, err := readResponse(ret.Body)
  323. if err != nil {
  324. t.Error(err)
  325. }
  326. if data.ErrorNo != 0 {
  327. t.Error("Get Password Config Api Error!")
  328. }
  329. // 设置配置
  330. ret, err = http.Post(TestHost+"/api/setup", "application/json", strings.NewReader(`
  331. {"action":"set","step":"password","account":"testCase","password":"testCase"}
  332. `))
  333. if err != nil {
  334. t.Error(err)
  335. }
  336. data, err = readResponse(ret.Body)
  337. if err != nil {
  338. t.Error(err)
  339. }
  340. if data.ErrorNo != 0 {
  341. t.Error("Set Password Config Api Error!")
  342. t.Error(data)
  343. }
  344. // 获取配置
  345. ret, err = http.Post(TestHost+"/api/setup", "application/json", strings.NewReader("{\"action\":\"get\",\"step\":\"password\"}"))
  346. if err != nil {
  347. t.Error(err)
  348. }
  349. data, err = readResponse(ret.Body)
  350. if err != nil {
  351. t.Error(err)
  352. }
  353. if data.ErrorNo != 0 {
  354. t.Error("Get Password Config Api Error!")
  355. }
  356. if cast.ToString(data.Data) != "testCase" {
  357. t.Error("Check Password Config Api Error!")
  358. }
  359. t.Log("Password Config Api Success!")
  360. }
  361. func testDomainSet(t *testing.T) {
  362. // 获取配置
  363. ret, err := http.Post(TestHost+"/api/setup", "application/json", strings.NewReader("{\"action\":\"get\",\"step\":\"domain\"}"))
  364. if err != nil {
  365. t.Error(err)
  366. }
  367. data, err := readResponse(ret.Body)
  368. if err != nil {
  369. t.Error(err)
  370. }
  371. if data.ErrorNo != 0 {
  372. t.Error("Get domain Config Api Error!")
  373. }
  374. // 设置配置
  375. ret, err = http.Post(TestHost+"/api/setup", "application/json", strings.NewReader(`
  376. {"action":"set","step":"domain","smtp_domain":"test.domain","web_domain":"mail.test.domain"}
  377. `))
  378. if err != nil {
  379. t.Error(err)
  380. }
  381. data, err = readResponse(ret.Body)
  382. if err != nil {
  383. t.Error(err)
  384. }
  385. if data.ErrorNo != 0 {
  386. t.Error("Set domain Config Api Error!")
  387. }
  388. // 获取配置
  389. ret, err = http.Post(TestHost+"/api/setup", "application/json", strings.NewReader("{\"action\":\"get\",\"step\":\"domain\"}"))
  390. if err != nil {
  391. t.Error(err)
  392. }
  393. data, err = readResponse(ret.Body)
  394. if err != nil {
  395. t.Error(err)
  396. }
  397. if data.ErrorNo != 0 {
  398. t.Error("Get Password Config Api Error!")
  399. }
  400. dt := data.Data.(map[string]interface{})
  401. if cast.ToString(dt["smtp_domain"]) != "test.domain" {
  402. t.Error("Check domain Config Api Error!")
  403. }
  404. if cast.ToString(dt["web_domain"]) != "mail.test.domain" {
  405. t.Error("Check domain Config Api Error!")
  406. }
  407. t.Log("domain Config Api Success!")
  408. }
  409. func testDNSSet(t *testing.T) {
  410. // 获取配置
  411. ret, err := http.Post(TestHost+"/api/setup", "application/json", strings.NewReader("{\"action\":\"get\",\"step\":\"dns\"}"))
  412. if err != nil {
  413. t.Error(err)
  414. }
  415. data, err := readResponse(ret.Body)
  416. if err != nil {
  417. t.Error(err)
  418. }
  419. if data.ErrorNo != 0 {
  420. t.Error("Get domain Config Api Error!")
  421. }
  422. t.Log("DNS Set Success!")
  423. }
  424. func testSSLSet(t *testing.T) {
  425. // 获取配置
  426. ret, err := http.Post(TestHost+"/api/setup", "application/json", strings.NewReader("{\"action\":\"get\",\"step\":\"ssl\"}"))
  427. if err != nil {
  428. t.Error(err)
  429. }
  430. data, err := readResponse(ret.Body)
  431. if err != nil {
  432. t.Error(err)
  433. }
  434. if data.ErrorNo != 0 {
  435. t.Error("Get domain Config Api Error!")
  436. }
  437. // 设置配置
  438. ret, err = http.Post(TestHost+"/api/setup", "application/json", strings.NewReader(`
  439. {"action":"set","step":"ssl","ssl_type":"1","key_path":"./config/ssl/private.key","crt_path":"./config/ssl/public.crt"}
  440. `))
  441. if err != nil {
  442. t.Error(err)
  443. }
  444. data, err = readResponse(ret.Body)
  445. if err != nil {
  446. t.Error(err)
  447. }
  448. if data.ErrorNo != 0 {
  449. t.Error("Set domain Config Api Error!")
  450. }
  451. t.Log("domain Config Api Success!")
  452. }
  453. func testLogin(t *testing.T) {
  454. ret, err := httpClient.Post(TestHost+"/api/login", "application/json", strings.NewReader("{\"account\":\"testCase\",\"password\":\"testCase\"}"))
  455. if err != nil {
  456. t.Error(err)
  457. }
  458. data, err := readResponse(ret.Body)
  459. if err != nil {
  460. t.Error(err)
  461. }
  462. if data.ErrorNo != 0 {
  463. t.Error("Login Api Error!")
  464. }
  465. t.Logf("testLogin Success! Response: %+v", data)
  466. }
  467. func testLoginUser2(t *testing.T) {
  468. ret, err := httpClient.Post(TestHost+"/api/login", "application/json", strings.NewReader("{\"account\":\"user2\",\"password\":\"user2New\"}"))
  469. if err != nil {
  470. t.Error(err)
  471. }
  472. data, err := readResponse(ret.Body)
  473. if err != nil {
  474. t.Error(err)
  475. }
  476. if data.ErrorNo != 0 {
  477. t.Error("Login User2 Api Error!", data)
  478. }
  479. t.Logf("testLoginUser2 Success! Response: %+v", data)
  480. }
  481. func testLoginUser3(t *testing.T) {
  482. ret, err := httpClient.Post(TestHost+"/api/login", "application/json", strings.NewReader("{\"account\":\"user3\",\"password\":\"user3\"}"))
  483. if err != nil {
  484. t.Error(err)
  485. }
  486. data, err := readResponse(ret.Body)
  487. if err != nil {
  488. t.Error(err)
  489. }
  490. if data.ErrorNo != 100 {
  491. t.Error("Login User3 Api Error!", data)
  492. }
  493. t.Logf("testLoginUser3 Success! Response: %+v", data)
  494. }
  495. func testSendEmail(t *testing.T) {
  496. ret, err := httpClient.Post(TestHost+"/api/email/send", "application/json", strings.NewReader(`
  497. {
  498. "from": {
  499. "name": "i",
  500. "email": "i@test.domain"
  501. },
  502. "to": [
  503. {
  504. "name": "y",
  505. "email": "y@test.domain"
  506. }
  507. ],
  508. "cc": [
  509. ],
  510. "subject": "Title",
  511. "text": "text",
  512. "html": "<div>text</div>"
  513. }
  514. `))
  515. if err != nil {
  516. t.Error(err)
  517. }
  518. data, err := readResponse(ret.Body)
  519. if err != nil {
  520. t.Error(err)
  521. }
  522. if data.ErrorNo != 0 {
  523. t.Error("Send Email Api Error!")
  524. }
  525. t.Logf("testSendEmail Success! Response: %+v", data)
  526. }
  527. func testSendEmail2User2ForSpam(t *testing.T) {
  528. ret, err := httpClient.Post(TestHost+"/api/email/send", "application/json", strings.NewReader(`
  529. {
  530. "from": {
  531. "name": "user2",
  532. "email": "user2@test.domain"
  533. },
  534. "to": [
  535. {
  536. "name": "y",
  537. "email": "admin@test.domain"
  538. }
  539. ],
  540. "cc": [
  541. ],
  542. "subject": "spam",
  543. "text": "NeedMove",
  544. "html": "<div>text</div>"
  545. }
  546. `))
  547. if err != nil {
  548. t.Error(err)
  549. }
  550. data, err := readResponse(ret.Body)
  551. if err != nil {
  552. t.Error(err)
  553. }
  554. if data.ErrorNo != 0 {
  555. t.Error("Send Email Api Error!")
  556. }
  557. t.Logf("testSendEmail2User2ForMove Success! Response: %+v", data)
  558. }
  559. func testSendEmail2User2ForMove(t *testing.T) {
  560. ret, err := httpClient.Post(TestHost+"/api/email/send", "application/json", strings.NewReader(`
  561. {
  562. "from": {
  563. "name": "user2",
  564. "email": "user2@test.domain"
  565. },
  566. "to": [
  567. {
  568. "name": "y",
  569. "email": "user2@test.domain"
  570. }
  571. ],
  572. "cc": [
  573. ],
  574. "subject": "MovePlease",
  575. "text": "NeedMove",
  576. "html": "<div>text</div>"
  577. }
  578. `))
  579. if err != nil {
  580. t.Error(err)
  581. }
  582. data, err := readResponse(ret.Body)
  583. if err != nil {
  584. t.Error(err)
  585. }
  586. if data.ErrorNo != 0 {
  587. t.Error("Send Email Api Error!")
  588. }
  589. t.Logf("testSendEmail2User2ForMove Success! Response: %+v", data)
  590. }
  591. func testSendEmail2User1(t *testing.T) {
  592. ret, err := httpClient.Post(TestHost+"/api/email/send", "application/json", strings.NewReader(`
  593. {
  594. "from": {
  595. "name": "i",
  596. "email": "i@test.domain"
  597. },
  598. "to": [
  599. {
  600. "name": "y",
  601. "email": "user1@test.domain"
  602. }
  603. ],
  604. "cc": [
  605. ],
  606. "subject": "HelloUser1",
  607. "text": "text",
  608. "html": "<div>text</div>"
  609. }
  610. `))
  611. if err != nil {
  612. t.Error(err)
  613. }
  614. data, err := readResponse(ret.Body)
  615. if err != nil {
  616. t.Error(err)
  617. }
  618. if data.ErrorNo != 0 {
  619. t.Error("Send Email Api Error!")
  620. }
  621. t.Logf("testSendEmail2User1 Success! Response: %+v", data)
  622. }
  623. func testSendEmail2User2(t *testing.T) {
  624. ret, err := httpClient.Post(TestHost+"/api/email/send", "application/json", strings.NewReader(`
  625. {
  626. "from": {
  627. "name": "i",
  628. "email": "i@test.domain"
  629. },
  630. "to": [
  631. {
  632. "name": "y",
  633. "email": "user2@test.domain"
  634. }
  635. ],
  636. "cc": [
  637. ],
  638. "subject": "HelloUser2",
  639. "text": "text",
  640. "html": "<div>text</div>"
  641. }
  642. `))
  643. if err != nil {
  644. t.Error(err)
  645. }
  646. data, err := readResponse(ret.Body)
  647. if err != nil {
  648. t.Error(err)
  649. }
  650. if data.ErrorNo != 0 {
  651. t.Error("Send Email Api Error!")
  652. }
  653. t.Logf("testSendEmail2User2 Success! Response: %+v", data)
  654. }
  655. func testSendEmail2User3(t *testing.T) {
  656. ret, err := httpClient.Post(TestHost+"/api/email/send", "application/json", strings.NewReader(`
  657. {
  658. "from": {
  659. "name": "i",
  660. "email": "i@test.domain"
  661. },
  662. "to": [
  663. {
  664. "name": "y",
  665. "email": "user3@test.domain"
  666. }
  667. ],
  668. "cc": [
  669. ],
  670. "subject": "HelloUser3",
  671. "text": "text",
  672. "html": "<div>text</div>"
  673. }
  674. `))
  675. if err != nil {
  676. t.Error(err)
  677. }
  678. data, err := readResponse(ret.Body)
  679. if err != nil {
  680. t.Error(err)
  681. }
  682. if data.ErrorNo != 0 {
  683. t.Error("Send Email Api Error!")
  684. }
  685. t.Logf("testSendEmail2User3 Success! Response: %+v", data)
  686. }
  687. func testEmailList(t *testing.T) {
  688. ret, err := httpClient.Post(TestHost+"/api/email/list", "application/json", strings.NewReader(`{}`))
  689. if err != nil {
  690. t.Error(err)
  691. }
  692. data, err := readResponse(ret.Body)
  693. if err != nil {
  694. t.Error(err)
  695. }
  696. if data.ErrorNo != 0 {
  697. t.Error("Get Email List Api Error!")
  698. }
  699. dt := data.Data.(map[string]interface{})
  700. if dt["list"] == nil || len(dt["list"].([]interface{})) == 0 {
  701. t.Error("Email List Is Empty!")
  702. return
  703. }
  704. lst := dt["list"].([]interface{})
  705. item := lst[0].(map[string]interface{})
  706. id := cast.ToInt(item["id"])
  707. if id == 0 {
  708. t.Error("Email List Data Error!")
  709. }
  710. t.Logf("testEmailList Success! Response: %+v", data)
  711. }
  712. func testUser2EmailList(t *testing.T) {
  713. ret, err := httpClient.Post(TestHost+"/api/email/list", "application/json", strings.NewReader(`{}`))
  714. if err != nil {
  715. t.Error(err)
  716. }
  717. data, err := readResponse(ret.Body)
  718. if err != nil {
  719. t.Error(err)
  720. }
  721. if data.ErrorNo != 0 {
  722. t.Error("Get Email List Api Error!")
  723. }
  724. dt := data.Data.(map[string]interface{})
  725. if dt["list"] == nil || len(dt["list"].([]interface{})) != 1 {
  726. t.Error("Email List Is Empty!")
  727. }
  728. t.Logf("testUser2EmailList Success! Response: %+v", data)
  729. }
  730. func testDelEmail(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 len(dt["list"].([]interface{})) == 0 {
  744. t.Error("Email List Is Empty!")
  745. }
  746. lst := dt["list"].([]interface{})
  747. item := lst[0].(map[string]interface{})
  748. id := cast.ToInt(item["id"])
  749. ret, err = httpClient.Post(TestHost+"/api/email/del", "application/json", strings.NewReader(fmt.Sprintf(`{
  750. "ids":[%d]
  751. }`, id)))
  752. if err != nil {
  753. t.Error(err)
  754. }
  755. data, err = readResponse(ret.Body)
  756. if err != nil {
  757. t.Error(err)
  758. }
  759. if data.ErrorNo != 0 {
  760. t.Error("Email Delete Api Error!")
  761. }
  762. var mail models.UserEmail
  763. db.Instance.Where("email_id = ?", id).Get(&mail)
  764. if mail.Status != 3 {
  765. t.Error("Email Delete Api Error!")
  766. }
  767. t.Logf("testDelEmail Success! Response: %+v", data)
  768. }
  769. // portCheck 检查端口是占用
  770. func portCheck(port int) bool {
  771. l, err := net.Listen("tcp", fmt.Sprintf(":%s", strconv.Itoa(port)))
  772. if err != nil {
  773. return true
  774. }
  775. defer l.Close()
  776. return false
  777. }
  778. func readResponse(r io.Reader) (*response.Response, error) {
  779. data, err := io.ReadAll(r)
  780. if err != nil {
  781. return nil, err
  782. }
  783. ret := &response.Response{}
  784. err = json.Unmarshal(data, ret)
  785. if err != nil {
  786. return nil, err
  787. }
  788. return ret, nil
  789. }