default_test.go 6.7KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258
  1. package test
  2. import (
  3. "encoding/json"
  4. "errors"
  5. "fmt"
  6. "path/filepath"
  7. "runtime"
  8. "strconv"
  9. "strings"
  10. "sws_xcx/enums"
  11. "sws_xcx/models"
  12. _ "sws_xcx/routers"
  13. "sws_xcx/service"
  14. "sws_xcx/utils"
  15. "testing"
  16. //beego "github.com/beego/beego/v2/server/web"
  17. //"github.com/beego/beego/v2/core/logs"
  18. "github.com/astaxie/beego"
  19. "github.com/jinzhu/gorm"
  20. "github.com/medivhzhan/weapp/v3/auth"
  21. // "github.com/smartystreets/goconvey/convey"
  22. )
  23. func init() {
  24. _, file, _, _ := runtime.Caller(0)
  25. apppath, _ := filepath.Abs(filepath.Dir(filepath.Join(file, ".."+string(filepath.Separator))))
  26. beego.TestBeegoInit(apppath)
  27. }
  28. // TestGet is a sample to run an endpoint test
  29. func TestGet(t *testing.T) {
  30. // r, _ := http.NewRequest("GET", "/v1/object", nil)
  31. // w := httptest.NewRecorder()
  32. // beego.BeeApp.Handlers.ServeHTTP(w, r)
  33. // logs.Info("testing", "TestGet", "Code[%d]\n%s", w.Code, w.Body.String())
  34. // Convey("Subject: Test Station Endpoint\n", t, func() {
  35. // Convey("Status Code Should Be 200", func() {
  36. // So(w.Code, ShouldEqual, 200)
  37. // })
  38. // Convey("The Result Should Not Be Empty", func() {
  39. // So(w.Body.Len(), ShouldBeGreaterThan, 0)
  40. // })
  41. // })
  42. t.Log("TestGet")
  43. }
  44. func TestWxappSessionCode(t *testing.T) {
  45. sdk := service.GetWxSdk()
  46. wxcli := sdk.NewAuth()
  47. code := "0d3eVp100qtUES1jgD300t5yN21eVp1t"
  48. resp, err := wxcli.Code2Session(&auth.Code2SessionRequest{JsCode: code, GrantType: "authorization_code", Appid: beego.AppConfig.String("appid"), Secret: beego.AppConfig.String("appsecret")})
  49. if err != nil {
  50. t.Error(err)
  51. return
  52. }
  53. if resp.CommonError.ErrCode != 0 {
  54. t.Errorf("err code:%v msg:%v", resp.CommonError.ErrCode, resp.CommonError.ErrMSG)
  55. return
  56. }
  57. t.Logf("resp: %+v", *resp)
  58. }
  59. func TestJson(t *testing.T) {
  60. req := `{"id":1,"nick_name":"zhangsan","ctime":"2019-11-20 16:49:08"}`
  61. u := models.UserInfoResp{}
  62. err := json.Unmarshal([]byte(req), &u)
  63. if err != nil {
  64. t.Error(err)
  65. }
  66. t.Logf("u:%+v", u)
  67. }
  68. func TestHandleMsg(t *testing.T) {
  69. req := []byte(`{"publish_received_at":1722839054218,"pub_props":{"User-Property":{}},"peerhost":"124.133.43.122","qos":0,"topic":"/CH-U100/09012201100010104/user/checkresult","clientid":"42915152F3F1","payload":"{\"productKey\":\"CH-U100\",\"deviceName\":\"09012201100010104\",\"acc\":12378,\"type\":0,\"count\":14,\"datatype\":0,\"verifycode\":212,\"data\":\"0,0,0,2,2,0,0,0,0,0,4,3,0,1\",\"origin\":\"4243305A0000010E0000000202000000000004030001D4\",\"len\":23}","username":"09012201100010104","event":"message.publish","metadata":{"rule_id":"checkresult"},"timestamp":1722839054218,"node":"emqx@127.0.0.1","id":"00061EE9B9D4F6AFF445000924860003","flags":{"retain":false,"dup":false}}`)
  70. msg := &models.OpenEmqMsgReqVO{}
  71. err := json.Unmarshal(req, msg)
  72. if err != nil {
  73. t.Error(err)
  74. return
  75. }
  76. ds := service.NewDeviceService()
  77. device, err := ds.GetDeviceByNo(msg.UserName)
  78. if err != nil && err != gorm.ErrRecordNotFound {
  79. utils.ErrorLog("GetDeviceByNo %v:", err)
  80. t.Error(err)
  81. return
  82. }
  83. if device.Id == 0 {
  84. utils.WarningLog("非本系统设备,数据废弃")
  85. return
  86. }
  87. err = ds.CreateDeviceMessageLog(models.DeviceMessageLog{
  88. DeviceName: msg.DeviceName,
  89. Content: string(req),
  90. EventType: enums.EventTypeEmqx,
  91. MessageId: msg.Id,
  92. Topic: msg.Topic,
  93. })
  94. if err != nil {
  95. utils.ErrorLog("CreateDeviceMessageLog %v:", err)
  96. t.Error(err)
  97. return
  98. }
  99. payload := &models.OpenEmqPayloadReqVO{}
  100. err = json.Unmarshal([]byte(msg.Payload), payload)
  101. if err != nil {
  102. utils.ErrorLog("json.Unmarshal %v:", err)
  103. t.Error(err)
  104. return
  105. }
  106. if payload.Len != 23 {
  107. utils.WarningLog("非标准数据,数据废弃:%v", msg.Payload)
  108. }
  109. dr, err := ds.GetDeviceRelateByDeviceId(device.Id)
  110. if err != nil {
  111. utils.ErrorLog("GetDeviceRelateByDeviceId %v:", err)
  112. t.Error(err)
  113. return
  114. }
  115. checkRecord := &models.CheckRecord{
  116. Acc: payload.Acc,
  117. PutSources: enums.EventTypeEmqx,
  118. MessageId: msg.Id,
  119. DeviceId: device.Id,
  120. UserId: dr.UserId,
  121. DeviceStatus: device.Status,
  122. }
  123. if dr.UserId > 0 {
  124. hp, err := service.NewUserHealthProfileService().GetUserHealthProfileByUserId(dr.UserId)
  125. if err != nil {
  126. utils.ErrorLog("GetUserHealthProfileByUserId %v:", err)
  127. t.Error(err)
  128. return
  129. }
  130. checkRecord.UserHealthProfileId = int64(hp.Id)
  131. }
  132. crs := service.NewCheckRecordService()
  133. err = crs.CreateCheckRecord(checkRecord)
  134. if err != nil {
  135. utils.ErrorLog("CreateCheckRecord %v:", err)
  136. t.Error(err)
  137. return
  138. }
  139. t.Log(checkRecord.Id)
  140. t.Log(payload.Data)
  141. da := strings.Split(payload.Data, ",")
  142. count := payload.Count
  143. if len(da) != count {
  144. t.Logf("数据长度不匹配,截取存储 %+v", payload)
  145. if len(da) < count {
  146. count = len(da)
  147. }
  148. }
  149. checkItems, err := service.NewCheckItemService().GetCheckItems("cn", device.DeviceType)
  150. if err != nil {
  151. utils.ErrorLog("GetCheckItems %v:", err)
  152. t.Error(err)
  153. return
  154. }
  155. if len(checkItems) < count {
  156. t.Error("接收的数据于检查项目配置不一致")
  157. return
  158. }
  159. alerts := make([]string, 0)
  160. for i := 0; i < count; i++ {
  161. vi, _ := strconv.Atoi(da[i])
  162. err = createCheckRecordItem(checkItems, checkRecord.Id, &alerts, vi, i+1, crs)
  163. if err != nil {
  164. utils.ErrorLog("createCheckRecordItem valule:%v, err:%v:", vi, err)
  165. }
  166. }
  167. if len(alerts) > 0 {
  168. alertItemIds := strings.Join(alerts, ",")
  169. err = crs.UpdateCheckRecordAlertItems(checkRecord.Id, alertItemIds)
  170. if err != nil {
  171. utils.ErrorLog("UpdateCheckRecordAlertItems %v:", err)
  172. t.Error(err)
  173. return
  174. }
  175. } else {
  176. utils.TraceLog("无异常数据")
  177. }
  178. }
  179. func createCheckRecordItem(items []*models.CheckItem, crId int64, alerts *[]string, vi, n int, crs *service.CheckRecordService) error {
  180. item := findItem(items, n)
  181. if item == nil {
  182. return fmt.Errorf("检测项目不匹配,需要检查基础数据!序号:%v", n)
  183. }
  184. cri := models.CheckRecordItem{
  185. CheckId: crId,
  186. CheckItemId: n,
  187. CheckValueIndex: vi,
  188. }
  189. scopes := []*models.CheckItemScopeVO{}
  190. err := json.Unmarshal([]byte(item.ScopeList), &scopes)
  191. if err != nil {
  192. return fmt.Errorf("检测项目数值范围定义不正确 err:%v", err)
  193. }
  194. scope := findScope(scopes, vi)
  195. if scope == nil {
  196. return errors.New("检测结果不匹配")
  197. }
  198. cri.CheckValue = scope.Value
  199. if scope.Type == 1 {
  200. *alerts = append(*alerts, strconv.Itoa(n))
  201. }
  202. return crs.CreateCheckRecordItem(&cri)
  203. }
  204. func findScope(scopes []*models.CheckItemScopeVO, vi int) *models.CheckItemScopeVO {
  205. for _, scope := range scopes {
  206. if scope.Index == vi {
  207. return scope
  208. }
  209. }
  210. return nil
  211. }
  212. func findItem(items []*models.CheckItem, itemNumber int) *models.CheckItem {
  213. //循环items
  214. for _, item := range items {
  215. if item.CheckItemNumber == itemNumber {
  216. return item
  217. }
  218. }
  219. return nil
  220. }