22 * @file End-to-end tests for Object Storage operations.
33 */
44
5- import { createBucket } from '@linode/api-v4/lib/object-storage' ;
5+ import {
6+ createBucket ,
7+ ObjectStorageCluster ,
8+ Region ,
9+ } from '@linode/api-v4/lib/object-storage' ;
10+ import { getNewRegionLabel } from '@linode/utilities' ;
611import { authenticate } from 'support/api/authentication' ;
712import {
813 interceptGetNetworkUtilization ,
@@ -16,6 +21,7 @@ import {
1621 interceptGetBuckets ,
1722 interceptUpdateBucketAccess ,
1823} from 'support/intercepts/object-storage' ;
24+ import { interceptGetRegions } from 'support/intercepts/regions' ;
1925import { ui } from 'support/ui' ;
2026import { cleanUp } from 'support/util/cleanup' ;
2127import { chooseCluster } from 'support/util/clusters' ;
@@ -58,6 +64,14 @@ const setUpBucket = (
5864 ) ;
5965} ;
6066
67+ const setupBuckets = (
68+ bucketsDetails : { cluster : ObjectStorageCluster ; label : string } [ ]
69+ ) => {
70+ return Promise . all (
71+ bucketsDetails . map ( ( { label, cluster } ) => setUpBucket ( label , cluster . id ) )
72+ ) ;
73+ } ;
74+
6175authenticate ( ) ;
6276beforeEach ( ( ) => {
6377 cy . tag ( 'method:e2e' ) ;
@@ -78,12 +92,11 @@ describe('object storage end-to-end tests', () => {
7892 cy . tag ( 'purpose:syntheticTesting' ) ;
7993 const bucketLabel = randomLabel ( ) ;
8094 const bucketClusterObj = chooseCluster ( ) ;
81- const bucketCluster = bucketClusterObj . id ;
8295 const bucketRegion = getRegionById ( bucketClusterObj . region ) . label ;
8396 const bucketHostname = `${ bucketLabel } .${ bucketClusterObj . domain } ` ;
8497 interceptGetBuckets ( ) . as ( 'getBuckets' ) ;
8598 interceptCreateBucket ( ) . as ( 'createBucket' ) ;
86- interceptDeleteBucket ( bucketLabel , bucketCluster ) . as ( 'deleteBucket' ) ;
99+ interceptDeleteBucket ( ) . as ( 'deleteBucket' ) ;
87100 interceptGetNetworkUtilization ( ) . as ( 'getNetworkUtilization' ) ;
88101
89102 mockGetAccount ( accountFactory . build ( { capabilities : [ 'Object Storage' ] } ) ) ;
@@ -197,4 +210,146 @@ describe('object storage end-to-end tests', () => {
197210 cy . findByText ( 'Bucket access updated successfully.' ) ;
198211 } ) ;
199212 } ) ;
213+
214+ /*
215+ * - Confirms that user can filter bucket list by region.
216+ */
217+ it ( 'can filter the list of buckets by region' , ( ) => {
218+ interceptGetBuckets ( ) . as ( 'getBuckets' ) ;
219+ interceptGetRegions ( ) . as ( 'getRegions' ) ;
220+
221+ const bucketsDetails = new Array ( 2 ) . fill ( { } ) . map ( ( ) => ( {
222+ label : randomLabel ( ) ,
223+ cluster : chooseCluster ( ) ,
224+ } ) ) ;
225+
226+ cy . defer (
227+ ( ) => setupBuckets ( bucketsDetails ) ,
228+ 'creating Object Storage bucket'
229+ ) . then ( ( ) => {
230+ cy . visitWithLogin ( '/object-storage/buckets' ) ;
231+ cy . wait ( '@getBuckets' ) ;
232+ cy . wait ( '@getRegions' ) . then ( ( { response } ) => {
233+ const regions : Region [ ] = response ?. body . data ;
234+
235+ const selectedBucket = bucketsDetails [ 0 ] ;
236+ const selectedRegion = regions . find (
237+ ( region ) => region . id === selectedBucket . cluster . region
238+ ) ;
239+
240+ const selectedRegionLabel = selectedRegion
241+ ? getNewRegionLabel ( selectedRegion )
242+ : '' ;
243+
244+ const regionSelect = ui . autocomplete
245+ . findByLabel ( 'Region' )
246+ . should ( 'be.visible' )
247+ . type ( selectedRegionLabel ) ;
248+
249+ ui . autocompletePopper
250+ . findByTitle ( selectedRegionLabel , { exact : false } )
251+ . should ( 'be.visible' )
252+ . click ( ) ;
253+
254+ regionSelect . click ( ) ;
255+
256+ cy . get ( 'tbody' ) . within ( ( ) => {
257+ cy . get ( 'tr' )
258+ . should ( 'have.length' , 1 )
259+ . within ( ( ) => {
260+ cy . findByText ( selectedBucket . label ) . should ( 'be.visible' ) ;
261+ } ) ;
262+ } ) ;
263+ } ) ;
264+ } ) ;
265+ } ) ;
266+
267+ /*
268+ * - Confirms that user can filter bucket list by endpoint.
269+ */
270+ it ( 'can filter the list of buckets by endpoint' , ( ) => {
271+ interceptGetBuckets ( ) . as ( 'getBuckets' ) ;
272+ interceptGetRegions ( ) . as ( 'getRegions' ) ;
273+
274+ const bucketsDetails = new Array ( 2 ) . fill ( { } ) . map ( ( ) => ( {
275+ label : randomLabel ( ) ,
276+ cluster : chooseCluster ( ) ,
277+ } ) ) ;
278+
279+ cy . defer (
280+ ( ) => setupBuckets ( bucketsDetails ) ,
281+ 'creating Object Storage bucket'
282+ ) . then ( ( ) => {
283+ cy . visitWithLogin ( '/object-storage/buckets' ) ;
284+ cy . wait ( [ '@getBuckets' , '@getRegions' ] ) ;
285+
286+ const selectedBucket = bucketsDetails [ 0 ] ;
287+ const selectedEndpoint = selectedBucket . cluster . id ;
288+ const endpointSelect = ui . autocomplete . findByLabel ( 'Endpoint' ) ;
289+ endpointSelect . should ( 'be.visible' ) . type ( selectedEndpoint ) ;
290+ ui . autocompletePopper
291+ . findByTitle ( selectedEndpoint , { exact : false } )
292+ . should ( 'be.visible' )
293+ . click ( ) ;
294+ endpointSelect . click ( ) ;
295+
296+ cy . get ( 'tbody' ) . within ( ( ) => {
297+ cy . get ( 'tr' )
298+ . should ( 'have.length' , 1 )
299+ . within ( ( ) => {
300+ cy . findByText ( selectedBucket . label ) . should ( 'be.visible' ) ;
301+ } ) ;
302+ } ) ;
303+ } ) ;
304+ } ) ;
305+
306+ /*
307+ * - Confirms that when region is selected, endpoint multiselect.
308+ * shows only endpoints related to the selected region.
309+ */
310+ it ( 'should filter list of endpoinds when region is selected' , ( ) => {
311+ interceptGetBuckets ( ) . as ( 'getBuckets' ) ;
312+ interceptGetRegions ( ) . as ( 'getRegions' ) ;
313+
314+ const bucketsDetails = new Array ( 2 ) . fill ( { } ) . map ( ( ) => ( {
315+ label : randomLabel ( ) ,
316+ cluster : chooseCluster ( ) ,
317+ } ) ) ;
318+
319+ cy . defer (
320+ ( ) => setupBuckets ( bucketsDetails ) ,
321+ 'creating Object Storage bucket'
322+ ) . then ( ( ) => {
323+ cy . visitWithLogin ( '/object-storage/buckets' ) ;
324+ cy . wait ( '@getBuckets' ) ;
325+ cy . wait ( '@getRegions' ) . then ( ( { response } ) => {
326+ const regions : Region [ ] = response ?. body . data ;
327+
328+ const selectedBucket = bucketsDetails [ 0 ] ;
329+ const selectedRegion = regions . find (
330+ ( region ) => region . id === selectedBucket . cluster . region
331+ ) ;
332+
333+ const selectedRegionLabel = selectedRegion
334+ ? getNewRegionLabel ( selectedRegion )
335+ : '' ;
336+
337+ const regionSelect = ui . autocomplete
338+ . findByLabel ( 'Region' )
339+ . should ( 'be.visible' )
340+ . type ( selectedRegionLabel ) ;
341+ ui . autocompletePopper
342+ . findByTitle ( selectedRegionLabel , { exact : false } )
343+ . should ( 'be.visible' )
344+ . click ( ) ;
345+ regionSelect . click ( ) ;
346+
347+ ui . autocomplete . findByLabel ( 'Endpoint' ) . should ( 'be.visible' ) . click ( ) ;
348+
349+ ui . autocompletePopper
350+ . findByTitle ( new RegExp ( '^.*-.*-.*\..*.' ) )
351+ . should ( 'have.length' , 1 ) ;
352+ } ) ;
353+ } ) ;
354+ } ) ;
200355} ) ;
0 commit comments