set('services.self_render.health_url', 'https://vm.local/health'); Http::fake(['vm.local/health' => Http::response($body, $status)]); } it('серый, когда адрес проверки не задан', function () { config()->set('services.self_render.endpoint', 'https://vm.local/render'); config()->set('services.self_render.health_url', ''); // 🪤 Раньше при пустом адресе проверки сторож пинговал саму ручку рендера. // Она принимает только POST и на GET отдаёт 404/405 — то есть сторож был // ЗЕЛЁНЫМ навсегда. Честный ответ здесь — «проверить нечем». expect((new SelfRenderLivenessProbe)->check()->light)->toBe('grey'); }); it('зелёный, когда виртуалка сказала ok', function () { vmHealth(['ok' => true, 'active' => 0, 'max' => 8, 'proxies' => 1]); $r = (new SelfRenderLivenessProbe)->check(); expect($r->light)->toBe('green') // Числа показываем человеку: занятость и наличие прокси видно сразу, // без похода на виртуалку руками. ->and($r->detail)->toContain('0 из 8') ->and($r->detail)->toContain('прокси 1'); }); it('КРАСНЫЙ, когда виртуалка сказала ok: false', function () { // Ради этого прогона всё и затевалось: раньше такой ответ был бы зелёным, // потому что 200 меньше 500. vmHealth(['ok' => false, 'active' => 8, 'max' => 8, 'proxies' => 0]); expect((new SelfRenderLivenessProbe)->check()->light)->toBe('red'); }); it('КРАСНЫЙ, когда про ok в ответе не сказано ничего', function () { // Ручка ответила 200, но не тем, о чём договаривались, — значит мы про // виртуалку ничего не знаем. Молчание засчитывать за «жива» нельзя. config()->set('services.self_render.health_url', 'https://vm.local/health'); Http::fake(['vm.local/health' => Http::response('ok', 200)]); expect((new SelfRenderLivenessProbe)->check()->light)->toBe('red'); }); it('КРАСНЫЙ на 404 и 405 — это GET к ручке, которая их не принимает', function () { // Прежний тест требовал здесь ЗЕЛЁНЫЙ. Именно это правило сделало сторожа // xf4 слепым навсегда, и его нельзя повторять. vmHealth(['ok' => true], 404); expect((new SelfRenderLivenessProbe)->check()->light)->toBe('red'); vmHealth(['ok' => true], 405); expect((new SelfRenderLivenessProbe)->check()->light)->toBe('red'); }); it('красный при 500 и при сетевой ошибке', function () { vmHealth(['ok' => false], 500); expect((new SelfRenderLivenessProbe)->check()->light)->toBe('red'); config()->set('services.self_render.health_url', 'https://vm.local/health'); Http::fake(fn () => throw new RuntimeException('down')); expect((new SelfRenderLivenessProbe)->check()->light)->toBe('red'); });