Skip to content

Commit

Permalink
feat: integrate MinIO for object store management in E2E tests
Browse files Browse the repository at this point in the history
  • Loading branch information
huynguyen-hl committed Mar 2, 2025
1 parent e0f0c3e commit ee2c74e
Show file tree
Hide file tree
Showing 3 changed files with 51 additions and 22 deletions.
67 changes: 46 additions & 21 deletions e2e/cypress.config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,21 @@ import { defineConfig } from 'cypress';
import fs from 'fs';
import path from 'path';
import util from 'util';
import { Client, ClientOptions } from 'minio';

const execPromise = util.promisify(exec);
export default defineConfig({
env: {
idrBucketName: process.env.IDR_BUCKET_NAME || 'idr-bucket-1',
idrGS1Prefix: process.env.IDR_GS1_PREFIX || 'gs1',
idrMinioConfig: {
endPoint: process.env.IDR_MINIO_ENDPOINT || 'localhost',
port: parseInt(process.env.IDR_MINIO_PORT || '9000', 10),
useSSL: process.env.IDR_MINIO_USE_SSL === 'true',
accessKey: process.env.IDR_MINIO_ACCESS_KEY || 'minioadmin',
secretKey: process.env.IDR_MINIO_SECRET_KEY || 'minioadmin',
},
},
e2e: {
baseUrl: 'http://localhost:3003', // Replace with your application's base URL
supportFile: 'cypress/support/e2e.ts',
Expand All @@ -16,7 +28,7 @@ export default defineConfig({
runMode: 2, // Retries in headless mode
openMode: 0, // No retries in interactive mode
},
defaultCommandTimeout: 4000,
defaultCommandTimeout: 10000,
defaultBrowser: 'chrome',
setupNodeEvents(on) {
on('task', {
Expand All @@ -34,29 +46,42 @@ export default defineConfig({
throw error;
}
},
resetData(file?: string) {

const targetDir = path.resolve(
process.cwd(),
`../minio_data/identity-resolver-service-object-store/data-test/idr-bucket-1/gs1${file ? `/${file}` : ''}`
);

if (fs.existsSync(targetDir)) {
console.log(`Found folder: ${targetDir}`);
console.log('Deleting folder...');

fs.rmdirSync(targetDir, { recursive: true });
async clearObjectStore({ bucketName, prefix, minioConfig }: { bucketName: string; prefix?: string; minioConfig: ClientOptions }) {
try {
if (!bucketName) {
return {
success: false,
message: 'Bucket name is required.',
}
}

if (!fs.existsSync(targetDir)) {
console.log('Folder deleted successfully.');
return { success: true };
} else {
console.log('Failed to delete the folder.');
return { success: false };
const minioClient = new Client(minioConfig);
const bucketExists = await minioClient.bucketExists(bucketName);
if (!bucketExists) {
return {
success: false,
message: `Bucket ${bucketName} does not exist.`,
};
}

const objects: string[] = [];
const bucketStream = minioClient.listObjectsV2(bucketName, prefix, true); // true for recursive

// Collect all object names
await new Promise<void>((resolve, reject) => {
bucketStream.on('data', (obj) => obj.name && objects.push(obj.name));
bucketStream.on('error', (err) => reject(err));
bucketStream.on('end', () => resolve());
});

if (objects.length > 0) {
await minioClient.removeObjects(bucketName, objects);
}
} else {
console.log(`Folder not found: ${targetDir}`);

return { success: true };
} catch (error) {
console.log(error);
throw error;
}
},
async runUntpTest({ type, version, testData }) {
Expand Down
5 changes: 4 additions & 1 deletion e2e/cypress/support/commands/common.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,7 @@
after(() => {
// cy.task('resetData');
const idrBucketName = Cypress.env('idrBucketName');
const idrGS1Prefix = Cypress.env('idrGS1Prefix');
const idrMinioConfig = Cypress.env('idrMinioConfig');
cy.task('clearObjectStore', { bucketName: idrBucketName, prefix: idrGS1Prefix, minioConfig: idrMinioConfig });
Cypress.env('lastCredential', undefined);
});
1 change: 1 addition & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,7 @@
"@types/uuid": "^9.0.7",
"cross-env": "^7.0.3",
"cypress": "^13.16.1",
"minio": "^8.0.4",
"eslint-plugin-prettier": "^5.1.3",
"husky": "^8.0.0",
"jest": "29.7.0",
Expand Down

0 comments on commit ee2c74e

Please sign in to comment.