diff --git a/goofy-client/apps/goofy-e2e/cypress-ci-einheitlicher-ansprechpartner.config.ts b/goofy-client/apps/goofy-e2e/cypress-ci-einheitlicher-ansprechpartner.config.ts new file mode 100644 index 0000000000000000000000000000000000000000..79cb702d7e3513dc5841286bc705d3c9b105b756 --- /dev/null +++ b/goofy-client/apps/goofy-e2e/cypress-ci-einheitlicher-ansprechpartner.config.ts @@ -0,0 +1,310 @@ +import { nxE2EPreset } from '@nrwl/cypress/plugins/cypress-preset'; +import { defineConfig } from 'cypress'; + +const MongoClient = require('mongodb').MongoClient; +const Binary = require('mongodb').Binary; +const ObjectId = require('mongodb').ObjectId; +const Long = require('mongodb').Long; + +const cypressJsonConfig = require('./cypress-ci-einheitlicher-ansprechpartner.json'); + +export default defineConfig({ + e2e: { + ...nxE2EPreset(__dirname), + ...cypressJsonConfig, + setupNodeEvents(on, config) { + on('task', { + initCommandData({collection, data}) { + console.log('initCommandData'); + insertIntoDatabase(config, collection, parseCommandData(data)); + return 0; + }, + initGridFsFileData({collection, data}) { + console.log('initGridFsFileData'); + insertIntoDatabase(config, collection, parseGridFsFileData(data)); + return 0; + }, + initGridFsChunkData({collection, data}) { + console.log('initGridFsChunkData'); + insertIntoDatabase(config, collection, parseGridFsChunkData(data)); + return 0; + }, + initVorgangData({collection, data}) { + console.log('initVorgangData'); + insertIntoDatabase(config, collection, parseVorgangData(data)); + return 0; + }, + initVorgangAttachedItemData({collection, data}) { + console.log('initVorgangAttachedItemData'); + insertIntoDatabase(config, collection, parseVorgangAttachedItemData(data)); + return 0; + }, + initUsermanagerData({collection, data}) { + console.log('initUsermanagerData'); + insertIntoUserManagerDatabase(config, collection, parseUserData(data)); + return 0; + }, + dropCollections(collections) { + console.log('dropCollections: ', collections); + dropCollectionsFromDatabase(config, collections); + return 0; + }, + dropUserManagerCollections(collections) { + console.log('dropUserManagerCollections: ', collections); + dropUserManagerCollectionsFromDatabase(config, collections); + return 0; + } + }); + + // Workaround für Angular 13 und Cypress mit Webpack 4, + // Siehe https://github.com/cypress-io/cypress/issues/19066#issuecomment-1012055705 + // Entfernen, sobald Cypress Webpack 5 nutzt - https://github.com/cypress-io/cypress/issues/19555 + // Ursache: Angular linker needed to link partial-ivy code, + // see https://angular.io/guide/creating-libraries#consuming-partial-ivy-code-outside-the-angular-cli + // Fehlerbild: + // - Anwendung läuft im Browser, aber nicht in Cypress. + // - Fehlermeldung in Cypress: The injectable 'SystemDateTimeProvider' needs to be compiled using the JIT compiler, but '@angular/compiler' is not available. + // Lösung: + // - NPM-Paket identifizieren, dass "SystemDateTimeProvider" enthält. + // - NPM-Paket im "test" Attribut unten hinzufügen. + const webpackPreprocessor = require('@cypress/webpack-batteries-included-preprocessor'); + const webpackOptions = webpackPreprocessor.defaultOptions.webpackOptions; + + webpackOptions.module.rules.unshift({ + test: /[/\\](@angular|@ngxp|angular-oauth2-oidc)[/\\].+\.m?js$/, + resolve: { + fullySpecified: false, + }, + use: { + loader: 'babel-loader', + options: { + plugins: ['@angular/compiler-cli/linker/babel'], + compact: false, + cacheDirectory: true + } + } + }); + + on('file:preprocessor', webpackPreprocessor({ + webpackOptions: webpackOptions, + typescript: require.resolve('typescript') + })); + + return config; + // Ende - Workaround für Angular 13 und Cypress mit Webpack 4 + } + }, +}); + +function parseCommandData(commands) { + commands.forEach(command => parseCommand(command)) + return commands; +} + +function parseCommand(command) { + command.createdAt = createDate(command.createdAt); + if(command.finishedAt){ + command.finishedAt = createDate(command.finishedAt); + } + command.relationVersion = createNumberLong(command.relationVersion); +} + +function parseGridFsFileData(gridFsFiles) { + gridFsFiles.forEach(gridFsFile => parseGridFsFile(gridFsFile)) + return gridFsFiles; +} + +function parseGridFsFile(gridFsFile) { + gridFsFile._id = createObjectId(gridFsFile); + gridFsFile.length = createNumberLong(gridFsFile.length); + gridFsFile.uploadDate = createDate(gridFsFile.uploadDate); +} + +function parseGridFsChunkData(gridFsChunks) { + gridFsChunks.forEach(gridFsChunk => parseGridFsChunk(gridFsChunk)); + return gridFsChunks; +} + +function parseGridFsChunk(gridFsChunk) { + gridFsChunk._id = createObjectId(gridFsChunk); + //TODO createObjectId nutzen, sobald diese umgestellt ist + gridFsChunk.files_id = new ObjectId(gridFsChunk.files_id.$oid); + gridFsChunk.data = createBinData(gridFsChunk.data); +} + +function parseVorgangData(data) { + data.forEach(vorgang => parseVorgang(vorgang)); + return data; +} + +function parseVorgang(vorgang) { + vorgang._id = createObjectId(vorgang); + vorgang.createdAt = createDate(vorgang.createdAt); + + vorgang.eingangs.forEach(eingang => parseEingang(eingang)); + + if (vorgang.wiedervorlages) { + vorgang.wiedervorlages.forEach(wiedervorlage => parseWiedervorlage(wiedervorlage)); + } + if(vorgang.kommentars){ + vorgang.kommentars.forEach(kommentar => parseKommentar(kommentar)); + } +} + +function parseEingang(eingang) { + eingang.header.createdAt = createDate(eingang.header.createdAt); + + if (eingang.attachments) { + eingang.attachments.forEach(attachment => parseAttachment(attachment)); + } + if (eingang.representations) { + eingang.representations.forEach(representation => parseRepresentations(representation)); + } +} + +function parseAttachment(attachment) { + attachment.files[ 0 ].content = createBinData(''); +} + +function createBinData(encoded64Value){ + return Binary(Buffer.from(encoded64Value, 'base64'), 0); +} + +function parseRepresentations(representation) { + representation.content = createBinary(representation); +} + +//TODO Code entfernen und stattdessen createBinData(value) nutzen +function createBinary(field) { + return Binary(field.content.$binary.base64, 'base64'); +} + +function parseWiedervorlage(wiedervorlage) { + wiedervorlage.frist = createDate(wiedervorlage.frist); + wiedervorlage.createdAt = createDate(wiedervorlage.createdAt); +} + +function parseKommentar(kommentar) { + kommentar.createdAt = createDate(kommentar.createdAt); +} + +function createDate(field) { + return new Date(field.$date); +} + +function parseVorgangAttachedItemData(vorgangAttachedItems){ + vorgangAttachedItems.forEach(vorgangAttachedItem => parseVorgangAttachedItem(vorgangAttachedItem)); + return vorgangAttachedItems; +} + +function parseVorgangAttachedItem(parseVorgangAttachedItem) { + parseVorgangAttachedItem._id = createObjectId(parseVorgangAttachedItem); + parseVorgangAttachedItem.version = createNumberLong(parseVorgangAttachedItem.version); +} + +function parseUserData(data) { + data.forEach(user => parseUser(user)); + return data; +} + +function parseUser(user) { + user._id = createObjectId(user); + user.createdAt = createDate(user.createdAt); +} + +//TOOD Beschraenkung auf _id aufheben +function createObjectId(field) { + return new ObjectId(field._id.$oid); +} + +function createNumberLong(numberValue){ + return Long.fromNumber(numberValue); +} + +function insertIntoDatabase(config, collection, data) { + insert(getDatabaseUrl(config), getDatabase(config), collection, data); +} + +function insertIntoUserManagerDatabase(config, collection, data){ + insert(getUserManagerDatabaseUrl(config), getUserManagerDatabase(config), collection, data); +} + +function insert(databaseUrl, databaseName, collection, data){ + MongoClient.connect(databaseUrl, (error, connection) => { + console.log(`connect to ${databaseName} database with ${databaseUrl}`); + if (!error) { + console.log('success'); + var db = connection.db(databaseName); + + db.collection(collection).drop(() => { + db.createCollection(collection, (error) => handleCreateCollection(db, connection, collection, data, error)); + }); + } else { + console.log('fail', error); + } + }); +} + +function handleCreateCollection(db, connection, collection, data, error) { + if (error) { + console.log(`Fehler beim Erstellen der Collection "${collection}": `, error); + } else { + console.log(`Collection ${collection} erfolgreich erstellt`); + insertManyToDatabase(db, connection, collection, data); + } +} + +function insertManyToDatabase(db, connection, collection, data) { + db.collection(collection).insertMany(data, (error) => handleInsertMany(connection, error)); +} + +function handleInsertMany(connection, error) { + if (error) { + console.log('Fehler beim Einlesen der Daten: ', error); + } else { + console.log('Die Daten wurden erfolgreich eingelesen.'); + } + connection.close(); +} + +function dropCollectionsFromDatabase(config, collections) { + dropCollections(getDatabaseUrl(config), getDatabase(config), collections); +} + +function getDatabaseUrl(config){ + return config.env.dbUrl; +} + +function getDatabase(config){ + return config.env.database +} + +function dropUserManagerCollectionsFromDatabase(config, collections){ + dropCollections(getUserManagerDatabaseUrl(config), getUserManagerDatabase(config), collections); +} + +function getUserManagerDatabaseUrl(config){ + return config.env.userManager.dbUrl; +} + +function getUserManagerDatabase(config){ + return config.env.userManager.database; +} + +function dropCollections(databaseUrl, databaseName, collections){ + MongoClient.connect(databaseUrl, (error, connection) => { + if (!error) { + const db = connection.db(databaseName); + collections.forEach((oneCollection, index) => { + console.log('drop collection', oneCollection); + db.collection(oneCollection).drop(() => { + //CHECKME Ist die Abfrage notwendig? + if(index == collections.length){ + console.log('close connection'); + connection.close(); + } + }); + }); + } + }); +} \ No newline at end of file diff --git a/goofy-client/apps/goofy-e2e/cypress-ci-main.config.ts b/goofy-client/apps/goofy-e2e/cypress-ci-main.config.ts new file mode 100644 index 0000000000000000000000000000000000000000..353cf7d7f7a7153bacc81d218f66ff2bed89acbd --- /dev/null +++ b/goofy-client/apps/goofy-e2e/cypress-ci-main.config.ts @@ -0,0 +1,310 @@ +import { nxE2EPreset } from '@nrwl/cypress/plugins/cypress-preset'; +import { defineConfig } from 'cypress'; + +const MongoClient = require('mongodb').MongoClient; +const Binary = require('mongodb').Binary; +const ObjectId = require('mongodb').ObjectId; +const Long = require('mongodb').Long; + +const cypressJsonConfig = require('./cypress-ci-main-tests.json'); + +export default defineConfig({ + e2e: { + ...nxE2EPreset(__dirname), + ...cypressJsonConfig, + setupNodeEvents(on, config) { + on('task', { + initCommandData({collection, data}) { + console.log('initCommandData'); + insertIntoDatabase(config, collection, parseCommandData(data)); + return 0; + }, + initGridFsFileData({collection, data}) { + console.log('initGridFsFileData'); + insertIntoDatabase(config, collection, parseGridFsFileData(data)); + return 0; + }, + initGridFsChunkData({collection, data}) { + console.log('initGridFsChunkData'); + insertIntoDatabase(config, collection, parseGridFsChunkData(data)); + return 0; + }, + initVorgangData({collection, data}) { + console.log('initVorgangData'); + insertIntoDatabase(config, collection, parseVorgangData(data)); + return 0; + }, + initVorgangAttachedItemData({collection, data}) { + console.log('initVorgangAttachedItemData'); + insertIntoDatabase(config, collection, parseVorgangAttachedItemData(data)); + return 0; + }, + initUsermanagerData({collection, data}) { + console.log('initUsermanagerData'); + insertIntoUserManagerDatabase(config, collection, parseUserData(data)); + return 0; + }, + dropCollections(collections) { + console.log('dropCollections: ', collections); + dropCollectionsFromDatabase(config, collections); + return 0; + }, + dropUserManagerCollections(collections) { + console.log('dropUserManagerCollections: ', collections); + dropUserManagerCollectionsFromDatabase(config, collections); + return 0; + } + }); + + // Workaround für Angular 13 und Cypress mit Webpack 4, + // Siehe https://github.com/cypress-io/cypress/issues/19066#issuecomment-1012055705 + // Entfernen, sobald Cypress Webpack 5 nutzt - https://github.com/cypress-io/cypress/issues/19555 + // Ursache: Angular linker needed to link partial-ivy code, + // see https://angular.io/guide/creating-libraries#consuming-partial-ivy-code-outside-the-angular-cli + // Fehlerbild: + // - Anwendung läuft im Browser, aber nicht in Cypress. + // - Fehlermeldung in Cypress: The injectable 'SystemDateTimeProvider' needs to be compiled using the JIT compiler, but '@angular/compiler' is not available. + // Lösung: + // - NPM-Paket identifizieren, dass "SystemDateTimeProvider" enthält. + // - NPM-Paket im "test" Attribut unten hinzufügen. + const webpackPreprocessor = require('@cypress/webpack-batteries-included-preprocessor'); + const webpackOptions = webpackPreprocessor.defaultOptions.webpackOptions; + + webpackOptions.module.rules.unshift({ + test: /[/\\](@angular|@ngxp|angular-oauth2-oidc)[/\\].+\.m?js$/, + resolve: { + fullySpecified: false, + }, + use: { + loader: 'babel-loader', + options: { + plugins: ['@angular/compiler-cli/linker/babel'], + compact: false, + cacheDirectory: true + } + } + }); + + on('file:preprocessor', webpackPreprocessor({ + webpackOptions: webpackOptions, + typescript: require.resolve('typescript') + })); + + return config; + // Ende - Workaround für Angular 13 und Cypress mit Webpack 4 + } + }, +}); + +function parseCommandData(commands) { + commands.forEach(command => parseCommand(command)) + return commands; +} + +function parseCommand(command) { + command.createdAt = createDate(command.createdAt); + if(command.finishedAt){ + command.finishedAt = createDate(command.finishedAt); + } + command.relationVersion = createNumberLong(command.relationVersion); +} + +function parseGridFsFileData(gridFsFiles) { + gridFsFiles.forEach(gridFsFile => parseGridFsFile(gridFsFile)) + return gridFsFiles; +} + +function parseGridFsFile(gridFsFile) { + gridFsFile._id = createObjectId(gridFsFile); + gridFsFile.length = createNumberLong(gridFsFile.length); + gridFsFile.uploadDate = createDate(gridFsFile.uploadDate); +} + +function parseGridFsChunkData(gridFsChunks) { + gridFsChunks.forEach(gridFsChunk => parseGridFsChunk(gridFsChunk)); + return gridFsChunks; +} + +function parseGridFsChunk(gridFsChunk) { + gridFsChunk._id = createObjectId(gridFsChunk); + //TODO createObjectId nutzen, sobald diese umgestellt ist + gridFsChunk.files_id = new ObjectId(gridFsChunk.files_id.$oid); + gridFsChunk.data = createBinData(gridFsChunk.data); +} + +function parseVorgangData(data) { + data.forEach(vorgang => parseVorgang(vorgang)); + return data; +} + +function parseVorgang(vorgang) { + vorgang._id = createObjectId(vorgang); + vorgang.createdAt = createDate(vorgang.createdAt); + + vorgang.eingangs.forEach(eingang => parseEingang(eingang)); + + if (vorgang.wiedervorlages) { + vorgang.wiedervorlages.forEach(wiedervorlage => parseWiedervorlage(wiedervorlage)); + } + if(vorgang.kommentars){ + vorgang.kommentars.forEach(kommentar => parseKommentar(kommentar)); + } +} + +function parseEingang(eingang) { + eingang.header.createdAt = createDate(eingang.header.createdAt); + + if (eingang.attachments) { + eingang.attachments.forEach(attachment => parseAttachment(attachment)); + } + if (eingang.representations) { + eingang.representations.forEach(representation => parseRepresentations(representation)); + } +} + +function parseAttachment(attachment) { + attachment.files[ 0 ].content = createBinData(''); +} + +function createBinData(encoded64Value){ + return Binary(Buffer.from(encoded64Value, 'base64'), 0); +} + +function parseRepresentations(representation) { + representation.content = createBinary(representation); +} + +//TODO Code entfernen und stattdessen createBinData(value) nutzen +function createBinary(field) { + return Binary(field.content.$binary.base64, 'base64'); +} + +function parseWiedervorlage(wiedervorlage) { + wiedervorlage.frist = createDate(wiedervorlage.frist); + wiedervorlage.createdAt = createDate(wiedervorlage.createdAt); +} + +function parseKommentar(kommentar) { + kommentar.createdAt = createDate(kommentar.createdAt); +} + +function createDate(field) { + return new Date(field.$date); +} + +function parseVorgangAttachedItemData(vorgangAttachedItems){ + vorgangAttachedItems.forEach(vorgangAttachedItem => parseVorgangAttachedItem(vorgangAttachedItem)); + return vorgangAttachedItems; +} + +function parseVorgangAttachedItem(parseVorgangAttachedItem) { + parseVorgangAttachedItem._id = createObjectId(parseVorgangAttachedItem); + parseVorgangAttachedItem.version = createNumberLong(parseVorgangAttachedItem.version); +} + +function parseUserData(data) { + data.forEach(user => parseUser(user)); + return data; +} + +function parseUser(user) { + user._id = createObjectId(user); + user.createdAt = createDate(user.createdAt); +} + +//TOOD Beschraenkung auf _id aufheben +function createObjectId(field) { + return new ObjectId(field._id.$oid); +} + +function createNumberLong(numberValue){ + return Long.fromNumber(numberValue); +} + +function insertIntoDatabase(config, collection, data) { + insert(getDatabaseUrl(config), getDatabase(config), collection, data); +} + +function insertIntoUserManagerDatabase(config, collection, data){ + insert(getUserManagerDatabaseUrl(config), getUserManagerDatabase(config), collection, data); +} + +function insert(databaseUrl, databaseName, collection, data){ + MongoClient.connect(databaseUrl, (error, connection) => { + console.log(`connect to ${databaseName} database with ${databaseUrl}`); + if (!error) { + console.log('success'); + var db = connection.db(databaseName); + + db.collection(collection).drop(() => { + db.createCollection(collection, (error) => handleCreateCollection(db, connection, collection, data, error)); + }); + } else { + console.log('fail', error); + } + }); +} + +function handleCreateCollection(db, connection, collection, data, error) { + if (error) { + console.log(`Fehler beim Erstellen der Collection "${collection}": `, error); + } else { + console.log(`Collection ${collection} erfolgreich erstellt`); + insertManyToDatabase(db, connection, collection, data); + } +} + +function insertManyToDatabase(db, connection, collection, data) { + db.collection(collection).insertMany(data, (error) => handleInsertMany(connection, error)); +} + +function handleInsertMany(connection, error) { + if (error) { + console.log('Fehler beim Einlesen der Daten: ', error); + } else { + console.log('Die Daten wurden erfolgreich eingelesen.'); + } + connection.close(); +} + +function dropCollectionsFromDatabase(config, collections) { + dropCollections(getDatabaseUrl(config), getDatabase(config), collections); +} + +function getDatabaseUrl(config){ + return config.env.dbUrl; +} + +function getDatabase(config){ + return config.env.database +} + +function dropUserManagerCollectionsFromDatabase(config, collections){ + dropCollections(getUserManagerDatabaseUrl(config), getUserManagerDatabase(config), collections); +} + +function getUserManagerDatabaseUrl(config){ + return config.env.userManager.dbUrl; +} + +function getUserManagerDatabase(config){ + return config.env.userManager.database; +} + +function dropCollections(databaseUrl, databaseName, collections){ + MongoClient.connect(databaseUrl, (error, connection) => { + if (!error) { + const db = connection.db(databaseName); + collections.forEach((oneCollection, index) => { + console.log('drop collection', oneCollection); + db.collection(oneCollection).drop(() => { + //CHECKME Ist die Abfrage notwendig? + if(index == collections.length){ + console.log('close connection'); + connection.close(); + } + }); + }); + } + }); +} \ No newline at end of file