11import { describe , expect , it } from "vitest" ;
22import type { GraphQLClient } from "../client/GraphQLClient.js" ;
33import type { OpenApiPluginOptions } from "../index.js" ;
4- import { getRoutes , getVersionMetadata } from "./getRoutes.js" ;
4+ import {
5+ buildVersionSwitchUrl ,
6+ getRoutes ,
7+ getVersionMetadata ,
8+ } from "./getRoutes.js" ;
59
610const mockClient = { } as GraphQLClient ;
711
@@ -13,23 +17,15 @@ const baseConfig: OpenApiPluginOptions = {
1317describe ( "getVersionMetadata" , ( ) => {
1418 it ( "returns empty metadata for raw type" , ( ) => {
1519 const result = getVersionMetadata ( { type : "raw" , input : "{}" } ) ;
16- expect ( result ) . toEqual ( {
17- versions : [ ] ,
18- labels : { } ,
19- downloadUrls : { } ,
20- } ) ;
20+ expect ( result ) . toEqual ( { versions : [ ] , versionMap : { } } ) ;
2121 } ) ;
2222
2323 it ( "returns empty metadata for non-array input" , ( ) => {
2424 const result = getVersionMetadata ( {
2525 type : "url" ,
2626 input : "https://example.com/openapi.json" ,
2727 } ) ;
28- expect ( result ) . toEqual ( {
29- versions : [ ] ,
30- labels : { } ,
31- downloadUrls : { } ,
32- } ) ;
28+ expect ( result ) . toEqual ( { versions : [ ] , versionMap : { } } ) ;
3329 } ) ;
3430
3531 it ( "extracts versions, labels and download URLs from versioned input" , ( ) => {
@@ -50,12 +46,17 @@ describe("getVersionMetadata", () => {
5046 ] ,
5147 } ) ;
5248
53- expect ( result ) . toEqual ( {
54- versions : [ "v1" , "v2" ] ,
55- labels : { v1 : "Version 1" , v2 : "v2" } ,
56- downloadUrls : {
57- v1 : "https://example.com/v1.json" ,
58- v2 : "https://example.com/v2.json" ,
49+ expect ( result . versions ) . toEqual ( [ "v1" , "v2" ] ) ;
50+ expect ( result . versionMap ) . toEqual ( {
51+ v1 : {
52+ label : "Version 1" ,
53+ downloadUrl : "https://example.com/v1.json" ,
54+ tagPages : undefined ,
55+ } ,
56+ v2 : {
57+ label : "v2" ,
58+ downloadUrl : "https://example.com/v2.json" ,
59+ tagPages : undefined ,
5960 } ,
6061 } ) ;
6162 } ) ;
@@ -66,8 +67,11 @@ describe("getVersionMetadata", () => {
6667 input : [ { path : "v3" , input : "https://example.com/v3.json" } ] ,
6768 } ) ;
6869
69- expect ( result . labels ) . toEqual ( { v3 : "v3" } ) ;
70- expect ( result . downloadUrls ) . toEqual ( { v3 : undefined } ) ;
70+ expect ( result . versionMap . v3 ) . toEqual ( {
71+ label : "v3" ,
72+ downloadUrl : undefined ,
73+ tagPages : undefined ,
74+ } ) ;
7175 } ) ;
7276
7377 it ( "extracts metadata from file type with versioned input" , ( ) => {
@@ -83,10 +87,11 @@ describe("getVersionMetadata", () => {
8387 ] ,
8488 } ) ;
8589
86- expect ( result ) . toEqual ( {
87- versions : [ "v1" ] ,
88- labels : { v1 : "File V1" } ,
89- downloadUrls : { v1 : "https://example.com/v1.json" } ,
90+ expect ( result . versions ) . toEqual ( [ "v1" ] ) ;
91+ expect ( result . versionMap . v1 ) . toEqual ( {
92+ label : "File V1" ,
93+ downloadUrl : "https://example.com/v1.json" ,
94+ tagPages : undefined ,
9095 } ) ;
9196 } ) ;
9297} ) ;
@@ -466,3 +471,29 @@ describe("getRoutes", () => {
466471 ) . toBeDefined ( ) ;
467472 } ) ;
468473} ) ;
474+
475+ describe ( "buildVersionSwitchUrl" , ( ) => {
476+ it ( "preserves tag when it exists in target version" , ( ) => {
477+ const target = {
478+ path : "/api/v2" ,
479+ label : "V2" ,
480+ tagPages : [ "users" , "posts" ] ,
481+ } ;
482+ expect ( buildVersionSwitchUrl ( target , "users" ) ) . toBe ( "/api/v2/users" ) ;
483+ } ) ;
484+
485+ it ( "falls back to version root when tag missing in target" , ( ) => {
486+ const target = { path : "/api/v2" , label : "V2" , tagPages : [ "users" ] } ;
487+ expect ( buildVersionSwitchUrl ( target , "analytics" ) ) . toBe ( "/api/v2" ) ;
488+ } ) ;
489+
490+ it ( "preserves tag when target has no tagPages (URL schemas)" , ( ) => {
491+ const target = { path : "/api/v2" , label : "V2" } ;
492+ expect ( buildVersionSwitchUrl ( target , "users" ) ) . toBe ( "/api/v2/users" ) ;
493+ } ) ;
494+
495+ it ( "returns version root when no current tag" , ( ) => {
496+ const target = { path : "/api/v2" , label : "V2" , tagPages : [ "users" ] } ;
497+ expect ( buildVersionSwitchUrl ( target , undefined ) ) . toBe ( "/api/v2" ) ;
498+ } ) ;
499+ } ) ;
0 commit comments