@@ -1783,3 +1783,129 @@ func TestWorkspaceBuildTimings(t *testing.T) {
1783
1783
require .Len (t , res .AgentConnectionTimings , 5 )
1784
1784
})
1785
1785
}
1786
+
1787
+ func TestWorkspaceBuildParametersBulk (t * testing.T ) {
1788
+ t .Parallel ()
1789
+
1790
+ t .Run ("EmptyBuildIDs" , func (t * testing.T ) {
1791
+ t .Parallel ()
1792
+ client := coderdtest .New (t , & coderdtest.Options {IncludeProvisionerDaemon : true })
1793
+ _ = coderdtest .CreateFirstUser (t , client )
1794
+
1795
+ ctx := testutil .Context (t , testutil .WaitShort )
1796
+
1797
+ // Test with empty build IDs
1798
+ params , err := client .WorkspaceBuildParametersBulk (ctx , []uuid.UUID {})
1799
+ require .NoError (t , err )
1800
+ require .Empty (t , params )
1801
+ })
1802
+
1803
+ t .Run ("MultipleBuilds" , func (t * testing.T ) {
1804
+ t .Parallel ()
1805
+ adminClient := coderdtest .New (t , & coderdtest.Options {IncludeProvisionerDaemon : true })
1806
+ first := coderdtest .CreateFirstUser (t , adminClient )
1807
+ memberClient , _ := coderdtest .CreateAnotherUser (t , adminClient , first .OrganizationID )
1808
+
1809
+ ctx := testutil .Context (t , testutil .WaitLong )
1810
+
1811
+ // Create a template with parameters
1812
+ version := coderdtest .CreateTemplateVersion (t , adminClient , first .OrganizationID , & echo.Responses {
1813
+ Parse : echo .ParseComplete ,
1814
+ ProvisionPlan : []* proto.Response {{
1815
+ Type : & proto.Response_Plan {
1816
+ Plan : & proto.PlanComplete {
1817
+ Parameters : []* proto.RichParameter {
1818
+ {
1819
+ Name : "param1" ,
1820
+ Type : "string" ,
1821
+ DefaultValue : "default1" ,
1822
+ },
1823
+ {
1824
+ Name : "param2" ,
1825
+ Type : "string" ,
1826
+ DefaultValue : "default2" ,
1827
+ },
1828
+ },
1829
+ },
1830
+ },
1831
+ }},
1832
+ ProvisionApply : echo .ApplyComplete ,
1833
+ })
1834
+ template := coderdtest .CreateTemplate (t , adminClient , first .OrganizationID , version .ID )
1835
+ coderdtest .AwaitTemplateVersionJobCompleted (t , adminClient , version .ID )
1836
+
1837
+ // Create two workspaces with different parameters
1838
+ workspace1 := coderdtest .CreateWorkspace (t , memberClient , template .ID , func (request * codersdk.CreateWorkspaceRequest ) {
1839
+ request .RichParameterValues = []codersdk.WorkspaceBuildParameter {
1840
+ {Name : "param1" , Value : "value1a" },
1841
+ {Name : "param2" , Value : "value2a" },
1842
+ }
1843
+ })
1844
+ coderdtest .AwaitWorkspaceBuildJobCompleted (t , memberClient , workspace1 .LatestBuild .ID )
1845
+
1846
+ workspace2 := coderdtest .CreateWorkspace (t , memberClient , template .ID , func (request * codersdk.CreateWorkspaceRequest ) {
1847
+ request .RichParameterValues = []codersdk.WorkspaceBuildParameter {
1848
+ {Name : "param1" , Value : "value1b" },
1849
+ {Name : "param2" , Value : "value2b" },
1850
+ }
1851
+ })
1852
+ coderdtest .AwaitWorkspaceBuildJobCompleted (t , memberClient , workspace2 .LatestBuild .ID )
1853
+
1854
+ workspace3 := coderdtest .CreateWorkspace (t , adminClient , template .ID , func (request * codersdk.CreateWorkspaceRequest ) {
1855
+ request .RichParameterValues = []codersdk.WorkspaceBuildParameter {
1856
+ {Name : "param1" , Value : "value1c" },
1857
+ {Name : "param2" , Value : "value2c" },
1858
+ }
1859
+ })
1860
+ coderdtest .AwaitWorkspaceBuildJobCompleted (t , adminClient , workspace3 .LatestBuild .ID )
1861
+ allBuildIDs := []uuid.UUID {workspace1 .LatestBuild .ID , workspace2 .LatestBuild .ID , workspace3 .LatestBuild .ID }
1862
+
1863
+ // Test parameters endpoint as member
1864
+ paramsByBuild , err := memberClient .WorkspaceBuildParametersBulk (ctx , allBuildIDs )
1865
+ require .NoError (t , err )
1866
+ require .Len (t , paramsByBuild , 2 )
1867
+
1868
+ // Check workspace1 parameters
1869
+ build1Params := paramsByBuild [workspace1 .LatestBuild .ID .String ()]
1870
+ require .Len (t , build1Params , 2 )
1871
+ require .ElementsMatch (t , build1Params , []codersdk.WorkspaceBuildParameter {
1872
+ {Name : "param1" , Value : "value1a" },
1873
+ {Name : "param2" , Value : "value2a" },
1874
+ })
1875
+
1876
+ // Check workspace2 parameters
1877
+ build2Params := paramsByBuild [workspace2 .LatestBuild .ID .String ()]
1878
+ require .Len (t , build2Params , 2 )
1879
+ require .ElementsMatch (t , build2Params , []codersdk.WorkspaceBuildParameter {
1880
+ {Name : "param1" , Value : "value1b" },
1881
+ {Name : "param2" , Value : "value2b" },
1882
+ })
1883
+
1884
+ // Test parameters endpoint as admin
1885
+ paramsByBuild , err = adminClient .WorkspaceBuildParametersBulk (ctx , allBuildIDs )
1886
+ require .NoError (t , err )
1887
+ require .Len (t , paramsByBuild , 3 )
1888
+
1889
+ // Check workspace3 parameters
1890
+ build3Params := paramsByBuild [workspace3 .LatestBuild .ID .String ()]
1891
+ require .Len (t , build3Params , 2 )
1892
+ require .ElementsMatch (t , build3Params , []codersdk.WorkspaceBuildParameter {
1893
+ {Name : "param1" , Value : "value1c" },
1894
+ {Name : "param2" , Value : "value2c" },
1895
+ })
1896
+ })
1897
+
1898
+ t .Run ("NonExistentBuildIDs" , func (t * testing.T ) {
1899
+ t .Parallel ()
1900
+ client := coderdtest .New (t , & coderdtest.Options {IncludeProvisionerDaemon : true })
1901
+ _ = coderdtest .CreateFirstUser (t , client )
1902
+
1903
+ ctx := testutil .Context (t , testutil .WaitShort )
1904
+
1905
+ // Test with non-existent build IDs
1906
+ nonExistentID := uuid .New ()
1907
+ params , err := client .WorkspaceBuildParametersBulk (ctx , []uuid.UUID {nonExistentID })
1908
+ require .NoError (t , err )
1909
+ require .Empty (t , params )
1910
+ })
1911
+ }
0 commit comments