11//
2- // Copyright 2024 The Chainloop Authors.
2+ // Copyright 2024-2025 The Chainloop Authors.
33//
44// Licensed under the Apache License, Version 2.0 (the "License");
55// you may not use this file except in compliance with the License.
@@ -18,6 +18,7 @@ package biz_test
1818import (
1919 "context"
2020 "testing"
21+ "time"
2122
2223 "github.com/chainloop-dev/chainloop/app/controlplane/pkg/biz"
2324 "github.com/chainloop-dev/chainloop/app/controlplane/pkg/biz/testhelpers"
@@ -57,6 +58,48 @@ func (s *ProjectVersionIntegrationTestSuite) TestUpdateReleaseStatus() {
5758 require .Error (t , err )
5859}
5960
61+ func (s * ProjectVersionIntegrationTestSuite ) TestReleasedAtTimestampPreserved () {
62+ t := s .T ()
63+ ctx := context .Background ()
64+
65+ // Create a prerelease version
66+ version , err := s .ProjectVersion .Create (ctx , s .project .ID .String (), "2.0.0" , true )
67+ require .NoError (t , err )
68+ require .True (t , version .Prerelease )
69+ require .Nil (t , version .ReleasedAt , "Prerelease version should not have released_at set" )
70+
71+ // Update to release status for the first time
72+ releasedVersion , err := s .ProjectVersion .UpdateReleaseStatus (ctx , version .ID .String (), true )
73+ require .NoError (t , err )
74+ require .False (t , releasedVersion .Prerelease )
75+ require .NotNil (t , releasedVersion .ReleasedAt , "Released version should have released_at set" )
76+ firstReleasedAt := releasedVersion .ReleasedAt
77+
78+ // Wait a bit to ensure timestamps would differ if reset
79+ time .Sleep (100 * time .Millisecond )
80+
81+ // Update to release status again (should preserve original timestamp)
82+ reReleasedVersion , err := s .ProjectVersion .UpdateReleaseStatus (ctx , version .ID .String (), true )
83+ require .NoError (t , err )
84+ require .False (t , reReleasedVersion .Prerelease )
85+ require .NotNil (t , reReleasedVersion .ReleasedAt , "Released version should still have released_at set" )
86+ require .Equal (t , firstReleasedAt , reReleasedVersion .ReleasedAt , "released_at timestamp should be preserved on subsequent release updates" )
87+
88+ // Update back to prerelease (should clear released_at)
89+ preReleaseVersion , err := s .ProjectVersion .UpdateReleaseStatus (ctx , version .ID .String (), false )
90+ require .NoError (t , err )
91+ require .True (t , preReleaseVersion .Prerelease )
92+ require .Nil (t , preReleaseVersion .ReleasedAt , "Prerelease version should have released_at cleared" )
93+
94+ // Update to release status again (should set a new timestamp)
95+ time .Sleep (100 * time .Millisecond )
96+ newReleasedVersion , err := s .ProjectVersion .UpdateReleaseStatus (ctx , version .ID .String (), true )
97+ require .NoError (t , err )
98+ require .False (t , newReleasedVersion .Prerelease )
99+ require .NotNil (t , newReleasedVersion .ReleasedAt , "Re-released version should have released_at set" )
100+ require .NotEqual (t , firstReleasedAt , newReleasedVersion .ReleasedAt , "released_at should be a new timestamp after toggling through prerelease" )
101+ }
102+
60103// 3 orgs, user belongs to org1 and org2 but not org3
61104func (s * ProjectVersionIntegrationTestSuite ) SetupTest () {
62105 t := s .T ()
0 commit comments