@@ -310,8 +310,8 @@ func (s *workflowRunIntegrationTestSuite) TestCreate() {
310310 RunnerType : "runnerType" , RunnerRunURL : "runURL" ,
311311 })
312312 s .Require ().NoError (err )
313- // Load project version
314- pv , err := s .ProjectVersion .FindByProjectAndVersion (ctx , s .workflowOrg1 .ProjectID .String (), "" )
313+ // Load project version — empty version is translated to DefaultVersionName
314+ pv , err := s .ProjectVersion .FindByProjectAndVersion (ctx , s .workflowOrg1 .ProjectID .String (), biz . DefaultVersionName )
315315 s .Require ().NoError (err )
316316 s .Equal ("runnerType" , run .RunnerType )
317317 s .Equal ("runURL" , run .RunURL )
@@ -321,26 +321,46 @@ func (s *workflowRunIntegrationTestSuite) TestCreate() {
321321
322322 s .T ().Run ("find or create version" , func (_ * testing.T ) {
323323 testCases := []struct {
324- version string
324+ name string
325+ version string
326+ expectedVersion string
325327 }{
326- {version : "" },
327- {version : "custom" },
328+ {name : "empty string maps to default" , version : "" , expectedVersion : biz . DefaultVersionName },
329+ {name : "custom version" , version : "custom" , expectedVersion : "custom" },
328330 }
329331
330332 for _ , tc := range testCases {
331- run , err := s .WorkflowRun .Create (ctx , & biz.WorkflowRunCreateOpts {
332- WorkflowID : s .workflowOrg1 .ID .String (), ContractRevision : s .contractVersion , CASBackendID : s .casBackend .ID ,
333- RunnerType : "runnerType" , RunnerRunURL : "runURL" , ProjectVersion : tc .version ,
333+ s .T ().Run (tc .name , func (_ * testing.T ) {
334+ run , err := s .WorkflowRun .Create (ctx , & biz.WorkflowRunCreateOpts {
335+ WorkflowID : s .workflowOrg1 .ID .String (), ContractRevision : s .contractVersion , CASBackendID : s .casBackend .ID ,
336+ RunnerType : "runnerType" , RunnerRunURL : "runURL" , ProjectVersion : tc .version ,
337+ })
338+ s .Require ().NoError (err )
339+ s .Equal (tc .expectedVersion , run .ProjectVersion .Version )
340+ pv , err := s .ProjectVersion .FindByProjectAndVersion (ctx , s .workflowOrg1 .ProjectID .String (), tc .expectedVersion )
341+ s .Require ().NoError (err )
342+ s .Equal (pv .ID , run .ProjectVersion .ID )
334343 })
335- s .Require ().NoError (err )
336- // Load project version
337- s .Equal (tc .version , run .ProjectVersion .Version )
338- pv , err := s .ProjectVersion .FindByProjectAndVersion (ctx , s .workflowOrg1 .ProjectID .String (), tc .version )
339- s .Require ().NoError (err )
340- s .Equal (pv .ID , run .ProjectVersion .ID )
341344 }
342345 })
343346
347+ s .T ().Run ("explicit v0 uses same default version" , func (_ * testing.T ) {
348+ // First create a run without version (gets default "v0")
349+ runDefault , err := s .WorkflowRun .Create (ctx , & biz.WorkflowRunCreateOpts {
350+ WorkflowID : s .workflowOrg1 .ID .String (), ContractRevision : s .contractVersion , CASBackendID : s .casBackend .ID ,
351+ })
352+ s .Require ().NoError (err )
353+ s .Equal (biz .DefaultVersionName , runDefault .ProjectVersion .Version )
354+
355+ // Now explicitly specify "v0" — should find the same version record
356+ runExplicit , err := s .WorkflowRun .Create (ctx , & biz.WorkflowRunCreateOpts {
357+ WorkflowID : s .workflowOrg1 .ID .String (), ContractRevision : s .contractVersion , CASBackendID : s .casBackend .ID ,
358+ ProjectVersion : biz .DefaultVersionName ,
359+ })
360+ s .Require ().NoError (err )
361+ s .Equal (runDefault .ProjectVersion .ID , runExplicit .ProjectVersion .ID )
362+ })
363+
344364 s .T ().Run ("use-latest-version resolves to version with latest=true" , func (_ * testing.T ) {
345365 // Create a named version first so we know which one is latest.
346366 namedRun , err := s .WorkflowRun .Create (ctx , & biz.WorkflowRunCreateOpts {
0 commit comments