run_p0_scope_test.ps1 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118
  1. $base = "http://localhost:3101/api"
  2. $results = @()
  3. function Test-Case($name, $ok, $detail) {
  4. $script:results += [pscustomobject]@{ Test = $name; Pass = $ok; Detail = $detail }
  5. $mark = if ($ok) { "PASS" } else { "FAIL" }
  6. Write-Host "[$mark] $name - $detail"
  7. }
  8. function Login($phone) {
  9. $body = @{ phone = $phone; password = "123456"; rememberMe = $false } | ConvertTo-Json
  10. $r = Invoke-RestMethod -Uri "$base/auth/login" -Method POST -Body $body -ContentType "application/json"
  11. if (-not $r.success) { throw "login failed: $email" }
  12. return @{ Token = $r.data.token; User = $r.data.user }
  13. }
  14. function Get-Overview($token, $query = "") {
  15. $h = @{ Authorization = "Bearer $token" }
  16. $uri = "$base/dashboard/overview"
  17. if ($query) { $uri = "$uri?$query" }
  18. try {
  19. $r = Invoke-RestMethod -Uri $uri -Method GET -Headers $h
  20. return @{ Ok = $true; Status = 200; Data = $r.data }
  21. } catch {
  22. $status = $_.Exception.Response.StatusCode.value__
  23. $body = $_.ErrorDetails.Message
  24. return @{ Ok = $false; Status = $status; Body = $body }
  25. }
  26. }
  27. function Get-Groups($token) {
  28. $h = @{ Authorization = "Bearer $token" }
  29. try {
  30. $r = Invoke-RestMethod -Uri "$base/qiwe/groups" -Method GET -Headers $h
  31. return @{ Ok = $true; Count = @($r.data.groups).Count; Data = $r.data }
  32. } catch {
  33. $status = $_.Exception.Response.StatusCode.value__
  34. return @{ Ok = $false; Status = $status; Body = $_.ErrorDetails.Message }
  35. }
  36. }
  37. Write-Host ""
  38. Write-Host "=== P0 Scope Tests ==="
  39. Write-Host ""
  40. try {
  41. Invoke-RestMethod -Uri "$base/qiwe/groups" -Method GET | Out-Null
  42. Test-Case "groups without auth rejected" $false "no error"
  43. } catch {
  44. $st = $_.Exception.Response.StatusCode.value__
  45. Test-Case "groups without auth rejected" ($st -eq 401) "HTTP $st"
  46. }
  47. $director = Login "13800000001"
  48. $supervisor = Login "13800000002"
  49. $manager = Login "13800000003"
  50. Test-Case "director login" ($director.User.role -eq "director") $director.User.email
  51. Test-Case "supervisor login" ($supervisor.User.role -eq "regional_supervisor") "regionCode=$($supervisor.User.regionCode)"
  52. Test-Case "manager login" ($manager.User.role -eq "store_manager") "storeId=$($manager.User.storeId)"
  53. $ovDirDefault = Get-Overview $director.Token
  54. Test-Case "director default scope is store" ($ovDirDefault.Data.scope.level -eq "store") "level=$($ovDirDefault.Data.scope.level)"
  55. $ovDirGlobal = Get-Overview $director.Token "scopeLevel=global"
  56. Test-Case "director can use global" ($ovDirGlobal.Ok -and $ovDirGlobal.Data.scope.level -eq "global") "level=$($ovDirGlobal.Data.scope.level)"
  57. $ovSupGlobal = Get-Overview $supervisor.Token "scopeLevel=global"
  58. Test-Case "supervisor blocked from global" (-not $ovSupGlobal.Ok -and $ovSupGlobal.Status -eq 403) "status=$($ovSupGlobal.Status)"
  59. $ovSupRegion = Get-Overview $supervisor.Token "scopeLevel=region"
  60. $regionOk = $ovSupRegion.Ok -and $ovSupRegion.Data.scope.level -eq "region"
  61. Test-Case "supervisor can use region" $regionOk "region=$($ovSupRegion.Data.scope.regionCode)"
  62. $ovSupDefault = Get-Overview $supervisor.Token
  63. Test-Case "supervisor default overview ok" $ovSupDefault.Ok "store=$($ovSupDefault.Data.scope.storeName)"
  64. $ovMgr = Get-Overview $manager.Token
  65. Test-Case "manager store overview" ($ovMgr.Ok -and $ovMgr.Data.scope.level -eq "store") "storeId=$($ovMgr.Data.scope.storeId)"
  66. $ovMgrGlobal = Get-Overview $manager.Token "scopeLevel=global"
  67. Test-Case "manager blocked from global" (-not $ovMgrGlobal.Ok -and $ovMgrGlobal.Status -eq 403) "status=$($ovMgrGlobal.Status)"
  68. $commOk = $false
  69. $commDetail = ""
  70. try {
  71. $h = @{ Authorization = "Bearer $($director.Token)" }
  72. $comm = Invoke-RestMethod -Uri "$base/qiwe/communities" -Method GET -Headers $h
  73. $total = $comm.data.total
  74. $commOk = $total -gt 0
  75. $commDetail = "total=$total"
  76. } catch {
  77. $commDetail = $_.Exception.Message
  78. }
  79. Test-Case "communities list has data" $commOk $commDetail
  80. $fieldOk = $false
  81. $fieldDetail = "no groups"
  82. if ($gMgr.Ok -and $gMgr.Count -gt 0) {
  83. $g0 = $gMgr.Data.groups[0]
  84. $fieldOk = ($null -ne $g0.healthGrade) -and ($null -ne $g0.lifecyclePhase)
  85. $fieldDetail = "grade=$($g0.healthGrade) phase=$($g0.lifecyclePhase)"
  86. }
  87. Test-Case "group has healthGrade and lifecyclePhase" $fieldOk $fieldDetail
  88. $lifeCount = @($ovDirDefault.Data.lifecycleDistribution).Count
  89. Test-Case "overview has lifecycleDistribution" ($lifeCount -gt 0) "count=$lifeCount"
  90. Write-Host ""
  91. Write-Host "=== Summary ==="
  92. $passed = ($results | Where-Object { $_.Pass }).Count
  93. $failed = ($results | Where-Object { -not $_.Pass }).Count
  94. Write-Host "Passed: $passed / $($results.Count), Failed: $failed"
  95. if ($failed -gt 0) {
  96. $results | Where-Object { -not $_.Pass } | Format-Table -AutoSize
  97. exit 1
  98. }
  99. exit 0