11import type { DiscoveredLocalServer } from "@t3tools/contracts" ;
22import { describe , expect , it } from "vite-plus/test" ;
33
4- import { mergeServers , type PreviewableServer } from "./useDiscoveredLocalServers" ;
4+ import { mergeServers } from "./useDiscoveredLocalServers" ;
55
66const scannerServer = (
77 overrides : Partial < DiscoveredLocalServer & { requestedUrl : string } > ,
@@ -21,15 +21,13 @@ describe("mergeServers", () => {
2121 const result = mergeServers ( {
2222 scanner : [ scannerServer ( { } ) ] ,
2323 configuredUrls : [ ] ,
24- recentlySeenUrls : [ ] ,
2524 } ) ;
2625 expect ( result ) . toHaveLength ( 1 ) ;
2726 expect ( result [ 0 ] ) . toMatchObject ( {
2827 host : "localhost" ,
2928 port : 5173 ,
3029 requestedUrl : "http://localhost:5173" ,
3130 source : "scanner" ,
32- listening : true ,
3331 processName : "vite" ,
3432 } ) ;
3533 } ) ;
@@ -38,102 +36,111 @@ describe("mergeServers", () => {
3836 const result = mergeServers ( {
3937 scanner : [ scannerServer ( { port : 5173 , processName : "node" , pid : 9999 } ) ] ,
4038 configuredUrls : [ "http://localhost:5173" ] ,
41- recentlySeenUrls : [ ] ,
4239 } ) ;
4340 expect ( result ) . toHaveLength ( 1 ) ;
4441 expect ( result [ 0 ] ) . toMatchObject ( {
4542 port : 5173 ,
4643 source : "configured" ,
47- listening : true ,
4844 processName : "node" ,
4945 pid : 9999 ,
5046 } ) ;
5147 } ) ;
5248
53- it ( "keeps configured entries that the scanner doesn't see, with listening=false " , ( ) => {
49+ it ( "excludes configured entries that the live scanner doesn't see" , ( ) => {
5450 const result = mergeServers ( {
5551 scanner : [ ] ,
5652 configuredUrls : [ "http://localhost:5173" ] ,
57- recentlySeenUrls : [ ] ,
5853 } ) ;
59- expect ( result ) . toHaveLength ( 1 ) ;
60- expect ( result [ 0 ] ) . toMatchObject ( {
61- source : "configured" ,
62- listening : false ,
63- requestedUrl : "http://localhost:5173/" ,
64- } ) ;
65- } ) ;
66-
67- it ( "dedupes recently-seen URLs against scanner+configured entries" , ( ) => {
68- const result = mergeServers ( {
69- scanner : [ scannerServer ( { port : 5173 } ) ] ,
70- configuredUrls : [ ] ,
71- recentlySeenUrls : [ "http://localhost:5173/" , "http://localhost:8080/" ] ,
72- } ) ;
73- expect ( result . map ( ( s ) => s . port ) ) . toEqual ( [ 5173 , 8080 ] ) ;
74- expect ( result . find ( ( s ) => s . port === 5173 ) ?. source ) . toBe ( "scanner" ) ;
75- expect ( result . find ( ( s ) => s . port === 8080 ) ?. source ) . toBe ( "recent" ) ;
76- expect ( result . find ( ( s ) => s . port === 8080 ) ?. requestedUrl ) . toBe ( "http://localhost:8080/" ) ;
54+ expect ( result ) . toHaveLength ( 0 ) ;
7755 } ) ;
7856
79- it ( "ignores non-loopback URLs in configured/recent inputs " , ( ) => {
57+ it ( "ignores non-loopback configured URLs " , ( ) => {
8058 const result = mergeServers ( {
81- scanner : [ ] ,
59+ scanner : [ scannerServer ( { } ) ] ,
8260 configuredUrls : [ "https://example.com" , "ws://localhost:5173" ] ,
83- recentlySeenUrls : [ "https://api.example.com" ] ,
8461 } ) ;
85- expect ( result ) . toHaveLength ( 0 ) ;
62+ expect ( result ) . toHaveLength ( 1 ) ;
63+ expect ( result [ 0 ] ?. source ) . toBe ( "scanner" ) ;
8664 } ) ;
8765
88- it ( "sorts: configured before scanner before recent, then by port " , ( ) => {
66+ it ( "sorts configured live servers before scanner-only servers " , ( ) => {
8967 const result = mergeServers ( {
9068 scanner : [ scannerServer ( { port : 8080 } ) , scannerServer ( { port : 3000 } ) ] ,
91- configuredUrls : [ "http://localhost:5173" ] ,
92- recentlySeenUrls : [ "http://localhost:9000/" , "http://localhost:4321/" ] ,
69+ configuredUrls : [ "http://localhost:8080" ] ,
9370 } ) ;
94- expect ( result . map ( ( s ) => `${ s . source } :${ s . port } ` ) ) . toEqual ( [
95- "configured:5173" ,
96- "scanner:3000" ,
97- "scanner:8080" ,
98- "recent:4321" ,
99- "recent:9000" ,
100- ] ) ;
71+ expect ( result . map ( ( s ) => `${ s . source } :${ s . port } ` ) ) . toEqual ( [ "configured:8080" , "scanner:3000" ] ) ;
10172 } ) ;
10273
10374 it ( "dedupes by lowercased host" , ( ) => {
10475 const result = mergeServers ( {
10576 scanner : [ scannerServer ( { host : "Localhost" , port : 5173 } ) ] ,
10677 configuredUrls : [ "http://localhost:5173" ] ,
107- recentlySeenUrls : [ ] ,
10878 } ) ;
10979 expect ( result ) . toHaveLength ( 1 ) ;
80+ expect ( result [ 0 ] ?. source ) . toBe ( "configured" ) ;
11081 } ) ;
11182
112- it ( "keeps a scanner entry's pre-resolution requestedUrl distinct from a resolved url" , ( ) => {
83+ it . each ( [ "127.0.0.1" , "0.0.0.0" , "[::1]" ] ) (
84+ "matches configured loopback alias %s to a live localhost server" ,
85+ ( host ) => {
86+ const result = mergeServers ( {
87+ scanner : [
88+ scannerServer ( { requestedUrl : `http://localhost:5173/dashboard?mode=test#results` } ) ,
89+ ] ,
90+ configuredUrls : [ `http://${ host } :5173/dashboard?mode=test#results` ] ,
91+ } ) ;
92+ expect ( result ) . toHaveLength ( 1 ) ;
93+ expect ( result [ 0 ] ?. source ) . toBe ( "configured" ) ;
94+ expect ( result [ 0 ] ?. requestedUrl ) . toBe ( "http://localhost:5173/dashboard?mode=test#results" ) ;
95+ } ,
96+ ) ;
97+
98+ it ( "keeps the scanner-verified path and protocol" , ( ) => {
11399 const result = mergeServers ( {
114100 scanner : [
115101 scannerServer ( {
116- port : 5173 ,
117102 url : "https://env-42.example.dev:5173/" ,
118- requestedUrl : "http://localhost:5173/" ,
103+ requestedUrl : "http://localhost:5173/dashboard?mode=test#results " ,
119104 } ) ,
120105 ] ,
121- configuredUrls : [ ] ,
122- recentlySeenUrls : [ ] ,
106+ configuredUrls : [ "https://localhost:5173/dashboard?mode=test#results" ] ,
123107 } ) ;
124108 expect ( result [ 0 ] ?. url ) . toBe ( "https://env-42.example.dev:5173/" ) ;
109+ expect ( result [ 0 ] ?. requestedUrl ) . toBe ( "http://localhost:5173/dashboard?mode=test#results" ) ;
110+ } ) ;
111+
112+ it ( "overlays a configured path when an older server does not advertise path probing" , ( ) => {
113+ const result = mergeServers ( {
114+ scanner : [ scannerServer ( { requestedUrl : "http://localhost:5173/" } ) ] ,
115+ configuredUrls : [ "https://localhost:5173/docs?mode=test#results" ] ,
116+ configuredUrlProbing : false ,
117+ } ) ;
118+
119+ expect ( result [ 0 ] ?. requestedUrl ) . toBe ( "https://localhost:5173/docs?mode=test#results" ) ;
120+ } ) ;
121+
122+ it ( "does not overlay an unverified configured path when the server probes paths" , ( ) => {
123+ const result = mergeServers ( {
124+ scanner : [ scannerServer ( { requestedUrl : "http://localhost:5173/" } ) ] ,
125+ configuredUrls : [ "http://localhost:5173/docs" ] ,
126+ configuredUrlProbing : true ,
127+ } ) ;
128+
125129 expect ( result [ 0 ] ?. requestedUrl ) . toBe ( "http://localhost:5173/" ) ;
126130 } ) ;
127- } ) ;
128131
129- describe ( "PreviewableServer interface" , ( ) => {
130- it ( "preserves listening flag through enrichment" , ( ) => {
132+ it ( "keeps a scanner entry's pre-resolution requestedUrl distinct from a resolved url" , ( ) => {
131133 const result = mergeServers ( {
132- scanner : [ scannerServer ( { } ) ] ,
133- configuredUrls : [ "http://localhost:5173" ] ,
134- recentlySeenUrls : [ ] ,
134+ scanner : [
135+ scannerServer ( {
136+ port : 5173 ,
137+ url : "https://env-42.example.dev:5173/" ,
138+ requestedUrl : "http://localhost:5173/" ,
139+ } ) ,
140+ ] ,
141+ configuredUrls : [ ] ,
135142 } ) ;
136- const merged : PreviewableServer | undefined = result [ 0 ] ;
137- expect ( merged ?. listening ) . toBe ( true ) ;
143+ expect ( result [ 0 ] ?. url ) . toBe ( "https://env-42.example.dev:5173/" ) ;
144+ expect ( result [ 0 ] ?. requestedUrl ) . toBe ( "http://localhost:5173/" ) ;
138145 } ) ;
139146} ) ;
0 commit comments