@@ -15,6 +15,7 @@ import (
1515
1616 "github.com/pb33f/libopenapi"
1717 "github.com/pb33f/libopenapi/datamodel"
18+ v3 "github.com/pb33f/libopenapi/datamodel/high/v3"
1819 "github.com/pb33f/libopenapi/index"
1920 "github.com/stretchr/testify/assert"
2021 "github.com/stretchr/testify/require"
@@ -754,3 +755,104 @@ oneOf:
754755
755756 runtime .GC ()
756757}
758+
759+ const emptyDefaultServerSpec = `openapi: 3.0.0
760+ info:
761+ title: defaults
762+ version: 1.0.0
763+ servers:
764+ - url: https://{env}.example.com
765+ variables:
766+ env:
767+ default: ""
768+ description: environment host
769+ - url: https://{shard}.example.com
770+ variables:
771+ shard:
772+ description: shard id
773+ default: ""
774+ - url: https://{slot}.example.com
775+ variables:
776+ slot:
777+ default: ""
778+ paths: {}`
779+
780+ func TestBundleBytesComposed_PreservesEmptyServerVariableDefaults (t * testing.T ) {
781+ spec := emptyDefaultServerSpec
782+
783+ tmp := t .TempDir ()
784+ require .NoError (t , os .WriteFile (filepath .Join (tmp , "main.yaml" ), []byte (spec ), 0o644 ))
785+
786+ data , err := os .ReadFile (filepath .Join (tmp , "main.yaml" ))
787+ require .NoError (t , err )
788+
789+ bundled , err := BundleBytesComposed (data , & datamodel.DocumentConfiguration {
790+ BasePath : tmp ,
791+ }, nil )
792+ require .NoError (t , err )
793+
794+ doc , err := libopenapi .NewDocument (bundled )
795+ require .NoError (t , err )
796+
797+ model , err := doc .BuildV3Model ()
798+ require .NoError (t , err )
799+
800+ var envVar , shardVar * v3.ServerVariable
801+ for _ , srv := range model .Model .Servers {
802+ if srv == nil || srv .Variables == nil {
803+ continue
804+ }
805+ if candidate := srv .Variables .GetOrZero ("env" ); candidate != nil {
806+ envVar = candidate
807+ }
808+ if candidate := srv .Variables .GetOrZero ("shard" ); candidate != nil {
809+ shardVar = candidate
810+ }
811+ }
812+
813+ require .NotNil (t , envVar , "env variable must exist" )
814+ assert .Equal (t , "" , envVar .Default )
815+ assert .False (t , envVar .GoLow ().Default .IsEmpty ())
816+ assert .Equal (t , "environment host" , envVar .Description )
817+
818+ require .NotNil (t , shardVar , "shard variable must exist" )
819+ assert .Equal (t , "" , shardVar .Default )
820+ assert .False (t , shardVar .GoLow ().Default .IsEmpty ())
821+ assert .Equal (t , "shard id" , shardVar .Description )
822+
823+ slotVar := model .Model .Servers [2 ].Variables .GetOrZero ("slot" )
824+ require .NotNil (t , slotVar , "slot variable must exist" )
825+ assert .Equal (t , "" , slotVar .Default )
826+ assert .False (t , slotVar .GoLow ().Default .IsEmpty ())
827+ assert .Equal (t , "" , slotVar .Description )
828+ }
829+
830+ func TestBundleBytes_PreservesEmptyServerVariableDefaults (t * testing.T ) {
831+ spec := []byte (emptyDefaultServerSpec )
832+
833+ bundled , err := BundleBytes (spec , & datamodel.DocumentConfiguration {})
834+ require .NoError (t , err )
835+
836+ doc , err := libopenapi .NewDocument (bundled )
837+ require .NoError (t , err )
838+
839+ model , err := doc .BuildV3Model ()
840+ require .NoError (t , err )
841+
842+ require .Len (t , model .Model .Servers , 3 )
843+
844+ envVar := model .Model .Servers [0 ].Variables .GetOrZero ("env" )
845+ require .NotNil (t , envVar )
846+ assert .Equal (t , "" , envVar .Default )
847+ assert .False (t , envVar .GoLow ().Default .IsEmpty ())
848+
849+ shardVar := model .Model .Servers [1 ].Variables .GetOrZero ("shard" )
850+ require .NotNil (t , shardVar )
851+ assert .Equal (t , "" , shardVar .Default )
852+ assert .False (t , shardVar .GoLow ().Default .IsEmpty ())
853+
854+ slotVar := model .Model .Servers [2 ].Variables .GetOrZero ("slot" )
855+ require .NotNil (t , slotVar )
856+ assert .Equal (t , "" , slotVar .Default )
857+ assert .False (t , slotVar .GoLow ().Default .IsEmpty ())
858+ }
0 commit comments