test: Refactor module test to remove unnecesary code

Signed-off-by: Carlos Esteban Lopez <lcarlosesteb@vmware.com>
This commit is contained in:
Carlos Esteban Lopez
2023-11-21 13:10:57 -05:00
parent 4c44c4af66
commit 343e1620cf
3 changed files with 9 additions and 168 deletions
@@ -32,14 +32,11 @@
"passport-oauth2": "^1.6.1"
},
"devDependencies": {
"@backstage/backend-app-api": "workspace:^",
"@backstage/backend-defaults": "workspace:^",
"@backstage/backend-test-utils": "workspace:^",
"@backstage/cli": "workspace:^",
"@backstage/config": "workspace:^",
"@backstage/plugin-auth-backend": "workspace:^",
"express": "^4.18.2",
"express-session": "^1.17.3",
"@types/passport-oauth2": "^1.4.15",
"msw": "^2.0.8",
"supertest": "^6.3.3"
},
@@ -13,170 +13,16 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import {
createHttpServer,
createSpecializedBackend,
DefaultRootHttpRouter,
ExtendedHttpServer,
HostDiscovery,
MiddlewareFactory,
} from '@backstage/backend-app-api';
import {
BackendFeature,
coreServices,
createServiceFactory,
} from '@backstage/backend-plugin-api';
import {
mockServices,
TestBackend,
TestBackendOptions,
} from '@backstage/backend-test-utils';
import { ConfigReader } from '@backstage/config';
import { mockServices, startTestBackend } from '@backstage/backend-test-utils';
import { decodeOAuthState } from '@backstage/plugin-auth-node';
import express from 'express';
import session from 'express-session';
import request from 'supertest';
import { Config } from '../config';
import { authModuleVmwareCloudProvider } from './module';
function isPromise<T>(value: unknown | Promise<T>): value is Promise<T> {
return (
typeof value === 'object' &&
value !== null &&
'then' in value &&
typeof value.then === 'function'
);
}
function unwrapFeature(
feature: BackendFeature | (() => BackendFeature),
): BackendFeature {
return typeof feature === 'function' ? feature() : feature;
}
const defaultServiceFactories = [
mockServices.cache.factory(),
mockServices.rootConfig.factory(),
mockServices.database.factory(),
mockServices.httpRouter.factory(),
mockServices.identity.factory(),
mockServices.lifecycle.factory(),
mockServices.logger.factory(),
mockServices.permissions.factory(),
mockServices.rootLifecycle.factory(),
mockServices.rootLogger.factory(),
mockServices.scheduler.factory(),
mockServices.tokenManager.factory(),
mockServices.urlReader.factory(),
];
async function createBackendWithSession<TExtensionPoints extends any[]>(
options: TestBackendOptions<TExtensionPoints>,
): Promise<TestBackend> {
const { extensionPoints, ...otherOptions } = options;
// Unpack input into awaited plain BackendFeatures
const features: BackendFeature[] = await Promise.all(
options.features?.map(async val => {
if (isPromise(val)) {
const { default: feature } = await val;
return unwrapFeature(feature);
}
return unwrapFeature(val);
}) ?? [],
);
let server: ExtendedHttpServer;
const rootHttpRouterFactory = createServiceFactory({
service: coreServices.rootHttpRouter,
deps: {
config: coreServices.rootConfig,
lifecycle: coreServices.rootLifecycle,
rootLogger: coreServices.rootLogger,
},
async factory({ config, lifecycle, rootLogger }) {
const router = DefaultRootHttpRouter.create();
const logger = rootLogger.child({ service: 'rootHttpRouter' });
const app = express();
const middleware = MiddlewareFactory.create({ config, logger });
const testSecret = 'secret';
app.use(
session({
secret: testSecret,
resave: false,
saveUninitialized: false,
}),
);
app.use(router.handler());
app.use(middleware.notFound());
app.use(middleware.error());
server = await createHttpServer(
app,
{ listen: { host: '', port: 0 } },
{ logger },
);
lifecycle.addShutdownHook(() => server.stop(), { logger });
await server.start();
return router;
},
});
const discoveryFactory = createServiceFactory({
service: coreServices.discovery,
deps: {
rootHttpRouter: coreServices.rootHttpRouter,
},
async factory() {
if (!server) {
throw new Error('Test server not started yet');
}
const port = server.port();
const discovery = HostDiscovery.fromConfig(
new ConfigReader({
backend: { baseUrl: `http://localhost:${port}`, listen: { port } },
}),
);
return discovery;
},
});
const backend = createSpecializedBackend({
...otherOptions,
defaultServiceFactories: [
...defaultServiceFactories,
rootHttpRouterFactory,
discoveryFactory,
],
});
for (const feature of features) {
backend.add(feature);
}
await backend.start();
return Object.assign(backend, {
get server() {
if (!server) {
throw new Error('TestBackend server is not available');
}
return server;
},
});
}
describe('authModuleVmwareCloudProvider', () => {
it('should start', async () => {
const backend = await createBackendWithSession({
const backend = await startTestBackend({
features: [
import('@backstage/plugin-auth-backend'),
authModuleVmwareCloudProvider,
@@ -186,6 +32,7 @@ describe('authModuleVmwareCloudProvider', () => {
baseUrl: 'http://localhost:3000',
},
auth: {
session: { secret: 'test' },
providers: {
vmwareCloudServices: {
development: {
+5 -8
View File
@@ -4844,19 +4844,16 @@ __metadata:
version: 0.0.0-use.local
resolution: "@backstage/plugin-auth-backend-module-vmware-cloud-provider@workspace:plugins/auth-backend-module-vmware-cloud-provider"
dependencies:
"@backstage/backend-app-api": "workspace:^"
"@backstage/backend-common": "workspace:^"
"@backstage/backend-defaults": "workspace:^"
"@backstage/backend-plugin-api": "workspace:^"
"@backstage/backend-test-utils": "workspace:^"
"@backstage/catalog-model": "workspace:^"
"@backstage/cli": "workspace:^"
"@backstage/config": "workspace:^"
"@backstage/errors": "workspace:^"
"@backstage/plugin-auth-backend": "workspace:^"
"@backstage/plugin-auth-node": "workspace:^"
express: ^4.18.2
express-session: ^1.17.3
"@types/passport-oauth2": ^1.4.15
jose: ^4.6.0
msw: ^2.0.8
passport-oauth2: ^1.6.1
@@ -18689,14 +18686,14 @@ __metadata:
languageName: node
linkType: hard
"@types/passport-oauth2@npm:*, @types/passport-oauth2@npm:^1.4.11":
version: 1.4.11
resolution: "@types/passport-oauth2@npm:1.4.11"
"@types/passport-oauth2@npm:*, @types/passport-oauth2@npm:^1.4.11, @types/passport-oauth2@npm:^1.4.15":
version: 1.4.15
resolution: "@types/passport-oauth2@npm:1.4.15"
dependencies:
"@types/express": "*"
"@types/oauth": "*"
"@types/passport": "*"
checksum: 09d047a6c09a05c036f7db0cf8f8c09bf5878fdd15949bb1baa09a35f439929d471048fa6595f09ea4a4ea25396ce3918b362136579cf4a2b2ee29a92c0dd1ce
checksum: 352c4e2d09a86f8fc0dcf2c917c221f302a35a14e7467e2fa3a1653c0a9a1f842c910a4e52f799856536522e6359c20d1afc319579d9edf4b2ac7ea11b183b52
languageName: node
linkType: hard