@@ -901,9 +901,9 @@ func TestPatchTemplateMeta(t *testing.T) {
901901
902902req := codersdk.UpdateTemplateMeta {
903903Name :"new-template-name" ,
904- DisplayName :"Displayed Name 456" ,
905- Description :"lorem ipsum dolor sit amet et cetera" ,
906- Icon :"/icon/new-icon.png" ,
904+ DisplayName :ptr . Ref ( "Displayed Name 456" ) ,
905+ Description :ptr . Ref ( "lorem ipsum dolor sit amet et cetera" ) ,
906+ Icon :ptr . Ref ( "/icon/new-icon.png" ) ,
907907DefaultTTLMillis :12 * time .Hour .Milliseconds (),
908908ActivityBumpMillis :3 * time .Hour .Milliseconds (),
909909AllowUserCancelWorkspaceJobs :false ,
@@ -918,9 +918,9 @@ func TestPatchTemplateMeta(t *testing.T) {
918918require .NoError (t ,err )
919919assert .Greater (t ,updated .UpdatedAt ,template .UpdatedAt )
920920assert .Equal (t ,req .Name ,updated .Name )
921- assert .Equal (t ,req .DisplayName ,updated .DisplayName )
922- assert .Equal (t ,req .Description ,updated .Description )
923- assert .Equal (t ,req .Icon ,updated .Icon )
921+ assert .Equal (t ,* req .DisplayName ,updated .DisplayName )
922+ assert .Equal (t ,* req .Description ,updated .Description )
923+ assert .Equal (t ,* req .Icon ,updated .Icon )
924924assert .Equal (t ,req .DefaultTTLMillis ,updated .DefaultTTLMillis )
925925assert .Equal (t ,req .ActivityBumpMillis ,updated .ActivityBumpMillis )
926926assert .False (t ,req .AllowUserCancelWorkspaceJobs )
@@ -930,9 +930,9 @@ func TestPatchTemplateMeta(t *testing.T) {
930930require .NoError (t ,err )
931931assert .Greater (t ,updated .UpdatedAt ,template .UpdatedAt )
932932assert .Equal (t ,req .Name ,updated .Name )
933- assert .Equal (t ,req .DisplayName ,updated .DisplayName )
934- assert .Equal (t ,req .Description ,updated .Description )
935- assert .Equal (t ,req .Icon ,updated .Icon )
933+ assert .Equal (t ,* req .DisplayName ,updated .DisplayName )
934+ assert .Equal (t ,* req .Description ,updated .Description )
935+ assert .Equal (t ,* req .Icon ,updated .Icon )
936936assert .Equal (t ,req .DefaultTTLMillis ,updated .DefaultTTLMillis )
937937assert .Equal (t ,req .ActivityBumpMillis ,updated .ActivityBumpMillis )
938938assert .False (t ,req .AllowUserCancelWorkspaceJobs )
@@ -1167,9 +1167,9 @@ func TestPatchTemplateMeta(t *testing.T) {
11671167
11681168got ,err := client .UpdateTemplateMeta (ctx ,template .ID , codersdk.UpdateTemplateMeta {
11691169Name :template .Name ,
1170- DisplayName :template .DisplayName ,
1171- Description :template .Description ,
1172- Icon :template .Icon ,
1170+ DisplayName :& template .DisplayName ,
1171+ Description :& template .Description ,
1172+ Icon :& template .Icon ,
11731173DefaultTTLMillis :0 ,
11741174AutostopRequirement :& template .AutostopRequirement ,
11751175AllowUserCancelWorkspaceJobs :template .AllowUserCancelWorkspaceJobs ,
@@ -1202,9 +1202,9 @@ func TestPatchTemplateMeta(t *testing.T) {
12021202
12031203got ,err := client .UpdateTemplateMeta (ctx ,template .ID , codersdk.UpdateTemplateMeta {
12041204Name :template .Name ,
1205- DisplayName :template .DisplayName ,
1206- Description :template .Description ,
1207- Icon :template .Icon ,
1205+ DisplayName :& template .DisplayName ,
1206+ Description :& template .Description ,
1207+ Icon :& template .Icon ,
12081208DefaultTTLMillis :template .DefaultTTLMillis ,
12091209AutostopRequirement :& template .AutostopRequirement ,
12101210AllowUserCancelWorkspaceJobs :template .AllowUserCancelWorkspaceJobs ,
@@ -1263,9 +1263,9 @@ func TestPatchTemplateMeta(t *testing.T) {
12631263allowAutostop .Store (false )
12641264got ,err := client .UpdateTemplateMeta (ctx ,template .ID , codersdk.UpdateTemplateMeta {
12651265Name :template .Name ,
1266- DisplayName :template .DisplayName ,
1267- Description :template .Description ,
1268- Icon :template .Icon ,
1266+ DisplayName :& template .DisplayName ,
1267+ Description :& template .Description ,
1268+ Icon :& template .Icon ,
12691269DefaultTTLMillis :template .DefaultTTLMillis ,
12701270AutostopRequirement :& template .AutostopRequirement ,
12711271AllowUserCancelWorkspaceJobs :template .AllowUserCancelWorkspaceJobs ,
@@ -1294,9 +1294,9 @@ func TestPatchTemplateMeta(t *testing.T) {
12941294
12951295got ,err := client .UpdateTemplateMeta (ctx ,template .ID , codersdk.UpdateTemplateMeta {
12961296Name :template .Name ,
1297- DisplayName :template .DisplayName ,
1298- Description :template .Description ,
1299- Icon :template .Icon ,
1297+ DisplayName :& template .DisplayName ,
1298+ Description :& template .Description ,
1299+ Icon :& template .Icon ,
13001300// Increase the default TTL to avoid error "not modified".
13011301DefaultTTLMillis :template .DefaultTTLMillis + 1 ,
13021302AutostopRequirement :& template .AutostopRequirement ,
@@ -1326,8 +1326,8 @@ func TestPatchTemplateMeta(t *testing.T) {
13261326
13271327req := codersdk.UpdateTemplateMeta {
13281328Name :template .Name ,
1329- Description :template .Description ,
1330- Icon :template .Icon ,
1329+ Description :& template .Description ,
1330+ Icon :& template .Icon ,
13311331DefaultTTLMillis :template .DefaultTTLMillis ,
13321332ActivityBumpMillis :template .ActivityBumpMillis ,
13331333AutostopRequirement :nil ,
@@ -1387,7 +1387,7 @@ func TestPatchTemplateMeta(t *testing.T) {
13871387ctr .Icon = "/icon/code.png"
13881388})
13891389req := codersdk.UpdateTemplateMeta {
1390- Icon :"" ,
1390+ Icon :ptr . Ref ( "" ) ,
13911391}
13921392
13931393ctx := testutil .Context (t ,testutil .WaitLong )
@@ -1442,9 +1442,9 @@ func TestPatchTemplateMeta(t *testing.T) {
14421442require .EqualValues (t ,1 ,template .AutostopRequirement .Weeks )
14431443req := codersdk.UpdateTemplateMeta {
14441444Name :template .Name ,
1445- DisplayName :template .DisplayName ,
1446- Description :template .Description ,
1447- Icon :template .Icon ,
1445+ DisplayName :& template .DisplayName ,
1446+ Description :& template .Description ,
1447+ Icon :& template .Icon ,
14481448AllowUserCancelWorkspaceJobs :template .AllowUserCancelWorkspaceJobs ,
14491449DefaultTTLMillis :time .Hour .Milliseconds (),
14501450AutostopRequirement :& codersdk.TemplateAutostopRequirement {
@@ -1519,9 +1519,9 @@ func TestPatchTemplateMeta(t *testing.T) {
15191519require .EqualValues (t ,2 ,template .AutostopRequirement .Weeks )
15201520req := codersdk.UpdateTemplateMeta {
15211521Name :template .Name ,
1522- DisplayName :template .DisplayName ,
1523- Description :template .Description ,
1524- Icon :template .Icon ,
1522+ DisplayName :& template .DisplayName ,
1523+ Description :& template .Description ,
1524+ Icon :& template .Icon ,
15251525AllowUserCancelWorkspaceJobs :template .AllowUserCancelWorkspaceJobs ,
15261526DefaultTTLMillis :time .Hour .Milliseconds (),
15271527AutostopRequirement :& codersdk.TemplateAutostopRequirement {
@@ -1556,9 +1556,9 @@ func TestPatchTemplateMeta(t *testing.T) {
15561556require .EqualValues (t ,1 ,template .AutostopRequirement .Weeks )
15571557req := codersdk.UpdateTemplateMeta {
15581558Name :template .Name ,
1559- DisplayName :template .DisplayName ,
1560- Description :template .Description ,
1561- Icon :template .Icon ,
1559+ DisplayName :& template .DisplayName ,
1560+ Description :& template .Description ,
1561+ Icon :& template .Icon ,
15621562AllowUserCancelWorkspaceJobs :template .AllowUserCancelWorkspaceJobs ,
15631563DefaultTTLMillis :time .Hour .Milliseconds (),
15641564AutostopRequirement :& codersdk.TemplateAutostopRequirement {
@@ -1618,6 +1618,106 @@ func TestPatchTemplateMeta(t *testing.T) {
16181618require .NoError (t ,err )
16191619assert .False (t ,updated .UseClassicParameterFlow ,"expected false" )
16201620})
1621+
1622+ t .Run ("SupportEmptyOrDefaultFields" ,func (t * testing.T ) {
1623+ t .Parallel ()
1624+
1625+ client := coderdtest .New (t ,nil )
1626+ user := coderdtest .CreateFirstUser (t ,client )
1627+ version := coderdtest .CreateTemplateVersion (t ,client ,user .OrganizationID ,nil )
1628+
1629+ displayName := "Test Display Name"
1630+ description := "test-description"
1631+ icon := "/icon/icon.png"
1632+ defaultTTLMillis := 10 * time .Hour .Milliseconds ()
1633+
1634+ reference := coderdtest .CreateTemplate (t ,client ,user .OrganizationID ,version .ID ,func (ctr * codersdk.CreateTemplateRequest ) {
1635+ ctr .DisplayName = displayName
1636+ ctr .Description = description
1637+ ctr .Icon = icon
1638+ ctr .DefaultTTLMillis = ptr .Ref (defaultTTLMillis )
1639+ })
1640+ require .Equal (t ,displayName ,reference .DisplayName )
1641+ require .Equal (t ,description ,reference .Description )
1642+ require .Equal (t ,icon ,reference .Icon )
1643+
1644+ restoreReq := codersdk.UpdateTemplateMeta {
1645+ DisplayName :& displayName ,
1646+ Description :& description ,
1647+ Icon :& icon ,
1648+ DefaultTTLMillis :defaultTTLMillis ,
1649+ }
1650+
1651+ type expected struct {
1652+ displayName string
1653+ description string
1654+ icon string
1655+ defaultTTLMillis int64
1656+ }
1657+
1658+ type testCase struct {
1659+ name string
1660+ req codersdk.UpdateTemplateMeta
1661+ expected expected
1662+ }
1663+
1664+ tests := []testCase {
1665+ {
1666+ name :"Only update default_ttl_ms" ,
1667+ req : codersdk.UpdateTemplateMeta {DefaultTTLMillis :99 * time .Hour .Milliseconds ()},
1668+ expected :expected {displayName :reference .DisplayName ,description :reference .Description ,icon :reference .Icon ,defaultTTLMillis :99 * time .Hour .Milliseconds ()},
1669+ },
1670+ {
1671+ name :"Clear display name" ,
1672+ req : codersdk.UpdateTemplateMeta {DisplayName :ptr .Ref ("" )},
1673+ expected :expected {displayName :"" ,description :reference .Description ,icon :reference .Icon ,defaultTTLMillis :0 },
1674+ },
1675+ {
1676+ name :"Clear description" ,
1677+ req : codersdk.UpdateTemplateMeta {Description :ptr .Ref ("" )},
1678+ expected :expected {displayName :reference .DisplayName ,description :"" ,icon :reference .Icon ,defaultTTLMillis :0 },
1679+ },
1680+ {
1681+ name :"Clear icon" ,
1682+ req : codersdk.UpdateTemplateMeta {Icon :ptr .Ref ("" )},
1683+ expected :expected {displayName :reference .DisplayName ,description :reference .Description ,icon :"" ,defaultTTLMillis :0 },
1684+ },
1685+ {
1686+ name :"Nil display name defaults to reference display name" ,
1687+ req : codersdk.UpdateTemplateMeta {DisplayName :nil },
1688+ expected :expected {displayName :reference .DisplayName ,description :reference .Description ,icon :reference .Icon ,defaultTTLMillis :0 },
1689+ },
1690+ {
1691+ name :"Nil description defaults to reference description" ,
1692+ req : codersdk.UpdateTemplateMeta {Description :nil },
1693+ expected :expected {displayName :reference .DisplayName ,description :reference .Description ,icon :reference .Icon ,defaultTTLMillis :0 },
1694+ },
1695+ {
1696+ name :"Nil icon defaults to reference icon" ,
1697+ req : codersdk.UpdateTemplateMeta {Icon :nil },
1698+ expected :expected {displayName :reference .DisplayName ,description :reference .Description ,icon :reference .Icon ,defaultTTLMillis :0 },
1699+ },
1700+ }
1701+
1702+ for _ ,tc := range tests {
1703+ //nolint:tparallel,paralleltest
1704+ t .Run (tc .name ,func (t * testing.T ) {
1705+ defer func () {
1706+ ctx := testutil .Context (t ,testutil .WaitLong )
1707+ // Restore reference after each test case
1708+ _ ,err := client .UpdateTemplateMeta (ctx ,reference .ID ,restoreReq )
1709+ require .NoError (t ,err )
1710+ }()
1711+ ctx := testutil .Context (t ,testutil .WaitLong )
1712+ updated ,err := client .UpdateTemplateMeta (ctx ,reference .ID ,tc .req )
1713+ require .NoError (t ,err )
1714+ assert .Equal (t ,tc .expected .displayName ,updated .DisplayName )
1715+ assert .Equal (t ,tc .expected .description ,updated .Description )
1716+ assert .Equal (t ,tc .expected .icon ,updated .Icon )
1717+ assert .Equal (t ,tc .expected .defaultTTLMillis ,updated .DefaultTTLMillis )
1718+ })
1719+ }
1720+ })
16211721}
16221722
16231723func TestDeleteTemplate (t * testing.T ) {