33 */
44
55import { createBucket } from '@linode/api-v4/lib/object-storage' ;
6+ import { getNewRegionLabel } from '@linode/utilities' ;
67import { authenticate } from 'support/api/authentication' ;
78import {
89 interceptGetNetworkUtilization ,
@@ -16,6 +17,7 @@ import {
1617 interceptGetBuckets ,
1718 interceptUpdateBucketAccess ,
1819} from 'support/intercepts/object-storage' ;
20+ import { interceptGetRegions } from 'support/intercepts/regions' ;
1921import { ui } from 'support/ui' ;
2022import { cleanUp } from 'support/util/cleanup' ;
2123import { chooseCluster } from 'support/util/clusters' ;
@@ -27,6 +29,11 @@ import {
2729 createObjectStorageBucketFactoryLegacy ,
2830} from 'src/factories' ;
2931
32+ import type {
33+ ObjectStorageCluster ,
34+ Region ,
35+ } from '@linode/api-v4/lib/object-storage' ;
36+
3037/**
3138 * Create a bucket with the given label and cluster.
3239 *
@@ -58,6 +65,14 @@ const setUpBucket = (
5865 ) ;
5966} ;
6067
68+ const setupBuckets = (
69+ bucketsDetails : { cluster : ObjectStorageCluster ; label : string } [ ]
70+ ) => {
71+ return Promise . all (
72+ bucketsDetails . map ( ( { label, cluster } ) => setUpBucket ( label , cluster . id ) )
73+ ) ;
74+ } ;
75+
6176authenticate ( ) ;
6277beforeEach ( ( ) => {
6378 cy . tag ( 'method:e2e' ) ;
@@ -78,12 +93,11 @@ describe('object storage end-to-end tests', () => {
7893 cy . tag ( 'purpose:syntheticTesting' ) ;
7994 const bucketLabel = randomLabel ( ) ;
8095 const bucketClusterObj = chooseCluster ( ) ;
81- const bucketCluster = bucketClusterObj . id ;
8296 const bucketRegion = getRegionById ( bucketClusterObj . region ) . label ;
8397 const bucketHostname = `${ bucketLabel } .${ bucketClusterObj . domain } ` ;
8498 interceptGetBuckets ( ) . as ( 'getBuckets' ) ;
8599 interceptCreateBucket ( ) . as ( 'createBucket' ) ;
86- interceptDeleteBucket ( bucketLabel , bucketCluster ) . as ( 'deleteBucket' ) ;
100+ interceptDeleteBucket ( ) . as ( 'deleteBucket' ) ;
87101 interceptGetNetworkUtilization ( ) . as ( 'getNetworkUtilization' ) ;
88102
89103 mockGetAccount ( accountFactory . build ( { capabilities : [ 'Object Storage' ] } ) ) ;
@@ -197,4 +211,146 @@ describe('object storage end-to-end tests', () => {
197211 cy . findByText ( 'Bucket access updated successfully.' ) ;
198212 } ) ;
199213 } ) ;
214+
215+ /*
216+ * - Confirms that user can filter bucket list by region.
217+ */
218+ it ( 'can filter the list of buckets by region' , ( ) => {
219+ interceptGetBuckets ( ) . as ( 'getBuckets' ) ;
220+ interceptGetRegions ( ) . as ( 'getRegions' ) ;
221+
222+ const bucketsDetails = new Array ( 2 ) . fill ( { } ) . map ( ( ) => ( {
223+ label : randomLabel ( ) ,
224+ cluster : chooseCluster ( ) ,
225+ } ) ) ;
226+
227+ cy . defer (
228+ ( ) => setupBuckets ( bucketsDetails ) ,
229+ 'creating Object Storage bucket'
230+ ) . then ( ( ) => {
231+ cy . visitWithLogin ( '/object-storage/buckets' ) ;
232+ cy . wait ( '@getBuckets' ) ;
233+ cy . wait ( '@getRegions' ) . then ( ( { response } ) => {
234+ const regions : Region [ ] = response ?. body . data ;
235+
236+ const selectedBucket = bucketsDetails [ 0 ] ;
237+ const selectedRegion = regions . find (
238+ ( region ) => region . id === selectedBucket . cluster . region
239+ ) ;
240+
241+ const selectedRegionLabel = selectedRegion
242+ ? getNewRegionLabel ( selectedRegion )
243+ : '' ;
244+
245+ const regionSelect = ui . autocomplete
246+ . findByLabel ( 'Region' )
247+ . should ( 'be.visible' )
248+ . type ( selectedRegionLabel ) ;
249+
250+ ui . autocompletePopper
251+ . findByTitle ( selectedRegionLabel , { exact : false } )
252+ . should ( 'be.visible' )
253+ . click ( ) ;
254+
255+ regionSelect . click ( ) ;
256+
257+ cy . get ( 'tbody' ) . within ( ( ) => {
258+ cy . get ( 'tr' )
259+ . should ( 'have.length' , 1 )
260+ . within ( ( ) => {
261+ cy . findByText ( selectedBucket . label ) . should ( 'be.visible' ) ;
262+ } ) ;
263+ } ) ;
264+ } ) ;
265+ } ) ;
266+ } ) ;
267+
268+ /*
269+ * - Confirms that user can filter bucket list by endpoint.
270+ */
271+ it ( 'can filter the list of buckets by endpoint' , ( ) => {
272+ interceptGetBuckets ( ) . as ( 'getBuckets' ) ;
273+ interceptGetRegions ( ) . as ( 'getRegions' ) ;
274+
275+ const bucketsDetails = new Array ( 2 ) . fill ( { } ) . map ( ( ) => ( {
276+ label : randomLabel ( ) ,
277+ cluster : chooseCluster ( ) ,
278+ } ) ) ;
279+
280+ cy . defer (
281+ ( ) => setupBuckets ( bucketsDetails ) ,
282+ 'creating Object Storage bucket'
283+ ) . then ( ( ) => {
284+ cy . visitWithLogin ( '/object-storage/buckets' ) ;
285+ cy . wait ( [ '@getBuckets' , '@getRegions' ] ) ;
286+
287+ const selectedBucket = bucketsDetails [ 0 ] ;
288+ const selectedEndpoint = selectedBucket . cluster . id ;
289+ const endpointSelect = ui . autocomplete . findByLabel ( 'Endpoint' ) ;
290+ endpointSelect . should ( 'be.visible' ) . type ( selectedEndpoint ) ;
291+ ui . autocompletePopper
292+ . findByTitle ( selectedEndpoint , { exact : false } )
293+ . should ( 'be.visible' )
294+ . click ( ) ;
295+ endpointSelect . click ( ) ;
296+
297+ cy . get ( 'tbody' ) . within ( ( ) => {
298+ cy . get ( 'tr' )
299+ . should ( 'have.length' , 1 )
300+ . within ( ( ) => {
301+ cy . findByText ( selectedBucket . label ) . should ( 'be.visible' ) ;
302+ } ) ;
303+ } ) ;
304+ } ) ;
305+ } ) ;
306+
307+ /*
308+ * - Confirms that when region is selected, endpoint multiselect.
309+ * shows only endpoints related to the selected region.
310+ */
311+ it ( 'should filter list of endpoinds when region is selected' , ( ) => {
312+ interceptGetBuckets ( ) . as ( 'getBuckets' ) ;
313+ interceptGetRegions ( ) . as ( 'getRegions' ) ;
314+
315+ const bucketsDetails = new Array ( 2 ) . fill ( { } ) . map ( ( ) => ( {
316+ label : randomLabel ( ) ,
317+ cluster : chooseCluster ( ) ,
318+ } ) ) ;
319+
320+ cy . defer (
321+ ( ) => setupBuckets ( bucketsDetails ) ,
322+ 'creating Object Storage bucket'
323+ ) . then ( ( ) => {
324+ cy . visitWithLogin ( '/object-storage/buckets' ) ;
325+ cy . wait ( '@getBuckets' ) ;
326+ cy . wait ( '@getRegions' ) . then ( ( { response } ) => {
327+ const regions : Region [ ] = response ?. body . data ;
328+
329+ const selectedBucket = bucketsDetails [ 0 ] ;
330+ const selectedRegion = regions . find (
331+ ( region ) => region . id === selectedBucket . cluster . region
332+ ) ;
333+
334+ const selectedRegionLabel = selectedRegion
335+ ? getNewRegionLabel ( selectedRegion )
336+ : '' ;
337+
338+ const regionSelect = ui . autocomplete
339+ . findByLabel ( 'Region' )
340+ . should ( 'be.visible' )
341+ . type ( selectedRegionLabel ) ;
342+ ui . autocompletePopper
343+ . findByTitle ( selectedRegionLabel , { exact : false } )
344+ . should ( 'be.visible' )
345+ . click ( ) ;
346+ regionSelect . click ( ) ;
347+
348+ ui . autocomplete . findByLabel ( 'Endpoint' ) . should ( 'be.visible' ) . click ( ) ;
349+
350+ ui . autocompletePopper
351+ . findByTitle ( new RegExp ( '^.*-.*-.*\..*.' ) )
352+ . should ( 'have.length' , 1 ) ;
353+ } ) ;
354+ } ) ;
355+ } ) ;
200356} ) ;
0 commit comments