import {test,expect} from "@playwright/test" const devices=[{id:1,name:"Первый",host:"first.test",enabled:true,status:null,type:"exit-node"},{id:2,name:"Второй",host:"second.test",enabled:true,status:"online",type:"exit-node"}] test.beforeEach(async({page})=>{await page.route("**/health",r=>r.fulfill({json:{ok:true}}));await page.route("**/api/**",r=>r.fulfill({json:new URL(r.request().url()).pathname==="/api/servers"?devices:new URL(r.request().url()).pathname==="/api/auth/config"?{required:false}:{tunnels:[]}}))}) for(const kind of ["API","bad-ip","wrong-host"])test("Источник preview: "+kind+" и повтор",async({page})=>{ let fail=true;await page.route("**/api/servers/1/ros-src-address",r=>r.fulfill(fail?(kind==="API"?{status:503,json:{error:"IPv4 отказ"}}:{json:{host:kind==="wrong-host"?"other.test":"first.test",ipv4:kind==="bad-ip"?"999.0.0.1":"192.0.2.1"}}):{json:{host:"first.test",ipv4:"192.0.2.1"}})) await page.goto("/probes?server=1");await expect(page.getByRole("alert",{name:"Источник preview"})).toBeVisible();await expect(page.getByRole("button",{name:"Запустить",exact:true})).toBeEnabled() fail=false;await page.getByRole("button",{name:"Повторить определение IPv4"}).click();await expect(page.getByRole("status").filter({hasText:"IPv4 для preview: 192.0.2.1"})).toBeVisible();await expect(page.getByRole("alert",{name:"Источник preview"})).toHaveCount(0) }) test("Источник preview: null не является ошибкой или IP",async({page})=>{ await page.route("**/api/servers/1/ros-src-address",r=>r.fulfill({json:{host:"first.test",ipv4:null}}));await page.goto("/probes?server=1");await expect(page.getByRole("status").filter({hasText:"IPv4 для preview не определён"})).toBeVisible();await expect(page.getByRole("alert",{name:"Источник preview"})).toHaveCount(0);await expect(page.getByText(/src-address=\?/)).toBeVisible() }) for(const fails of [false,true])test("Источник preview: поздний адрес прежнего устройства "+fails,async({page})=>{ let started=false,completed=false,release!:()=>void;const gate=new Promise(r=>release=r) await page.route("**/api/servers/1/ros-src-address",async r=>{started=true;await gate;try{await r.fulfill(fails?{status:503,json:{error:"СТАРАЯ ОШИБКА"}}:{json:{host:"first.test",ipv4:"192.0.2.1"}})}catch{}finally{completed=true}}) await page.route("**/api/servers/2/ros-src-address",r=>r.fulfill({json:{host:"second.test",ipv4:"192.0.2.2"}})) await page.goto("/probes?server=1");await expect.poll(()=>started).toBe(true);await page.getByRole("option",{name:/Второй/}).click();await expect(page.getByRole("status").filter({hasText:"IPv4 для preview: 192.0.2.2"})).toBeVisible();release();await expect.poll(()=>completed).toBe(true) await expect(page.getByText(/src-address=192.0.2.2/)).toBeVisible();await expect(page.getByText(/192.0.2.1|СТАРАЯ ОШИБКА/)).toHaveCount(0) }) test("Источник preview: DNS не запрашивает RouterOS источник",async({page})=>{ let reads=0;await page.route("**/api/servers/*/ros-src-address",r=>{reads++;return r.fulfill({json:{host:"first.test",ipv4:null}})}) await page.goto("/probes");await page.getByRole("button",{name:"DNS",exact:true}).click();await page.getByRole("option",{name:/Первый/}).click();await expect(page.getByRole("textbox",{name:"Домен"})).toBeVisible();expect(reads).toBe(0) })