fix(api): показать частичные отказы каталога контейнеров
This commit is contained in:
1 parent
1e0fc4cd2d
commit
644ddb64b3
10 files changed
+191
-5
No files matched your search
@@ -0,0 +1,18 @@
|
||||
import assert from "node:assert/strict"
|
||||
import Fastify from "fastify"
|
||||
import { validatorCompiler, serializerCompiler } from "@fastify/type-provider-zod"
|
||||
import { createContainersRoutes } from "./containers.js"
|
||||
import { permissionForRequest } from "../lib/permissions.js"
|
||||
const empty = {collectedAt:new Date().toISOString(),servers:[]}
|
||||
let value:unknown=empty,failed=false
|
||||
const app=Fastify();app.setValidatorCompiler(validatorCompiler);app.setSerializerCompiler(serializerCompiler)
|
||||
await app.register(createContainersRoutes({getState:async()=>{if(failed)throw new Error("DB unavailable");return value as typeof empty}}),{prefix:"/api"})
|
||||
const read=()=>app.inject({method:"GET",url:"/api/containers/state"})
|
||||
assert.equal((await read()).statusCode,200);assert.deepEqual((await read()).json().servers,[])
|
||||
value={...empty,servers:[{serverId:1,collectedAt:empty.collectedAt,availability:"error",containers:[],failures:[{resource:"containers",error:"offline"}]}]}
|
||||
assert.equal((await read()).statusCode,200);assert.equal((await read()).json().servers[0].availability,"error")
|
||||
for(const bad of [{containers:[]},{...empty,servers:[{serverId:1}]},{...empty,collectedAt:"yesterday"}]){value=bad;assert.equal((await read()).statusCode,502)}
|
||||
failed=true;assert.equal((await read()).statusCode,500)
|
||||
assert.equal(permissionForRequest("GET","/api/containers/state"),"mm:dashboard:read")
|
||||
assert.equal(permissionForRequest("POST","/api/servers/1/containers/start"),"mm:servers:write")
|
||||
await app.close();console.log("Containers HTTP: explicit empty/partial error, invalid state 502, DB failure 500, existing permission contract")
|
||||
Reference in new issue
Block a user