Skip to content

Commit

Permalink
Merge pull request #623 from immobiliare/test/added-test-new-backend-…
Browse files Browse the repository at this point in the history
…system

test: added test new backend system
  • Loading branch information
antoniomuso committed Mar 11, 2024
2 parents abb2436 + ecd2b5d commit 329b7a8
Show file tree
Hide file tree
Showing 6 changed files with 3,699 additions and 1,178 deletions.
13 changes: 8 additions & 5 deletions packages/ldap-auth-backend/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -29,9 +29,9 @@
},
"dependencies": {
"@backstage/backend-plugin-api": "^0.6.13",
"@backstage/core-plugin-api": "^1.0.3",
"@backstage/errors": "^1.1.0",
"@backstage/plugin-auth-backend": "^0.19.0",
"@backstage/core-plugin-api": "^1.9.0",
"@backstage/errors": "^1.2.3",
"@backstage/plugin-auth-backend": "^0.21.3",
"@backstage/plugin-auth-node": "^0.4.8",
"keyv": "^4.3.3",
"ldap-authentication": "^3.0.3",
Expand All @@ -42,10 +42,13 @@
"react": "^16.13.1 || ^17.0.0"
},
"devDependencies": {
"@backstage/cli": "^0.22.0",
"@backstage/backend-test-utils": "^0.3.3",
"@backstage/cli": "^0.25.2",
"@types/ldap-escape": "^2.0.0",
"@types/ldapjs": "^2.2.4",
"@types/node": "^20.5.9"
"@types/node": "^20.5.9",
"@types/supertest": "^6.0.2",
"supertest": "^6.3.4"
},
"files": [
"dist"
Expand Down
151 changes: 151 additions & 0 deletions packages/ldap-auth-backend/src/alpha.test.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,151 @@
import {
ldapAuthExtensionPoint,
default as ldapAuthModule,
tokenValidatorFactory,
} from './alpha';
import { mockServices, startTestBackend } from '@backstage/backend-test-utils';
import request from 'supertest';
import { COOKIE_FIELD_KEY, JWTTokenValidator } from './jwt';
import Keyv from 'keyv';
import { createBackendModule } from '@backstage/backend-plugin-api';

describe('ldapProvider new backend system', () => {
it('extension point should work', async () => {
let invalidateTokenMock;
let ldapAuthenticationMock = jest.fn(() =>
Promise.resolve({
dn: 'test',
uid: 'test',
givenName: 'test',
cn: 'test',
uidNumber: 'test',
gidNumber: '42423',
homeDirectory: '/home',
mail: 'test@gmail.com',
sn: 'mock',
})
);

let authHandlerMock = jest.fn(() =>
Promise.resolve({
email: 'test@gmail.com',
displayName: 'test',
})
);

let signIn = jest.fn(() =>
Promise.resolve({
token: 'random',
})
);

const createTokenValidator = () => {
const token = new JWTTokenValidator(new Keyv());

invalidateTokenMock = jest.fn(() => Promise.resolve());
token.invalidateToken = invalidateTokenMock;
return token;
};
const { server } = await startTestBackend({
features: [
import('@backstage/plugin-auth-backend'),
ldapAuthModule,
createBackendModule({
pluginId: 'auth',
moduleId: 'ldap-ext',
register(reg) {
reg.registerInit({
deps: {
ldapAuth: ldapAuthExtensionPoint,
},
async init({ ldapAuth }) {
ldapAuth.set({
tokenValidator: createTokenValidator(),
resolvers: {
ldapAuthentication:
ldapAuthenticationMock,
},
authHandler: authHandlerMock as any,
signIn: { resolver: signIn },
});
},
});
},
}),
mockServices.rootConfig.factory({
data: {
app: {
baseUrl: 'http://localhost:3000',
},
auth: {
providers: {
ldap: {
test: {
cookies: { secure: false },
ldapAuthenticationOptions: {
usernameAttribute: 'uid',
},
},
},
},
},
},
}),
],
});

const agent = request.agent(server);
await agent
.post('/api/auth/ldap/refresh')
.send({ username: 'hello', password: 'world' });

expect(ldapAuthenticationMock).toHaveBeenCalled();
expect(invalidateTokenMock).not.toHaveBeenCalled();

expect(authHandlerMock).toHaveBeenCalled();
expect(signIn).toHaveBeenCalled();
});

it('service should work', async () => {
let isValidMock = jest.fn(() => Promise.resolve(true));
const createTokenValidator = () => {
const token = new JWTTokenValidator(new Keyv());
token.isValid = isValidMock;
return token;
};
const { server } = await startTestBackend({
features: [
import('@backstage/plugin-auth-backend'),
ldapAuthModule,
tokenValidatorFactory({ createTokenValidator }),
mockServices.rootConfig.factory({
data: {
app: {
baseUrl: 'http://localhost:3000',
},
auth: {
providers: {
ldap: {
test: {
cookies: { secure: false },
ldapAuthenticationOptions: {
usernameAttribute: 'uid',
},
},
},
},
},
},
}),
],
});

const agent = request.agent(server);
await agent
.post('/api/auth/ldap/refresh')
.set('Cookie', [`${COOKIE_FIELD_KEY}=eyJqd3QiOiJ`])
.send({});

expect(isValidMock).toHaveBeenCalled();
});
});
51 changes: 33 additions & 18 deletions packages/ldap-auth-backend/src/alpha.ts
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,33 @@ import { AuthHandler } from '@backstage/plugin-auth-backend';
import Keyv from 'keyv';

interface LdapAuthSetter {
set(handler: ProviderCreateOptions): void;
set(opt: ProviderCreateOptions): void;
}

class LdapAuthExt implements LdapAuthSetter {
#authHandler: AuthHandler<Partial<LDAPResponse>> | undefined;
#resolvers: Resolvers | undefined;
#signInResolver: SignInResolver | undefined;
#tokenValidatorExt: TokenValidator | undefined;
set(opt: ProviderCreateOptions): void {
this.#authHandler = opt.authHandler;
this.#resolvers = opt.resolvers;
this.#signInResolver = opt.signIn;
this.#tokenValidatorExt = opt.tokenValidator;
}

get authHandler() {
return this.#authHandler;
}
get resolvers() {
return this.#resolvers;
}
get signInResolver() {
return this.#signInResolver;
}
get tokenValidatorExt() {
return this.#tokenValidatorExt;
}
}
export const ldapAuthExtensionPoint = createExtensionPoint<LdapAuthSetter>({
id: 'ldap-auth-extension',
Expand Down Expand Up @@ -61,19 +87,7 @@ export default createBackendModule({
pluginId: 'auth',
moduleId: 'ldap',
register(reg) {
let authHandler: AuthHandler<Partial<LDAPResponse>> | undefined;
let resolvers: Resolvers | undefined;
let signInResolver: SignInResolver | undefined;
let tokenValidatorExt: TokenValidator | undefined;

const ldapAuthSetter = {
set(opt: ProviderCreateOptions) {
authHandler = opt.authHandler;
resolvers = opt.resolvers;
signInResolver = opt.signIn;
tokenValidatorExt = opt.tokenValidator;
},
};
const ldapAuthSetter = new LdapAuthExt();
reg.registerExtensionPoint<LdapAuthSetter>(
ldapAuthExtensionPoint,
ldapAuthSetter
Expand All @@ -88,10 +102,11 @@ export default createBackendModule({
providers.registerProvider({
providerId: 'ldap',
factory: ldap.create({
tokenValidator: tokenValidatorExt || tokenValidator,
authHandler,
resolvers,
signIn: signInResolver,
tokenValidator:
ldapAuthSetter.tokenValidatorExt || tokenValidator,
authHandler: ldapAuthSetter.authHandler,
resolvers: ldapAuthSetter.resolvers,
signIn: ldapAuthSetter.signInResolver,
}),
});
},
Expand Down
2 changes: 1 addition & 1 deletion packages/ldap-auth-backend/src/provider.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ import { AuthenticationError } from '@backstage/errors';
import { AUTH_MISSING_CREDENTIALS, JWT_EXPIRED_TOKEN } from './errors';
import Keyv from 'keyv';

function createProvider() {
export function createProvider() {
const sub = 'my-uid-name';
const token = jwt.sign({ sub }, 'secret', {
expiresIn: '1min',
Expand Down
8 changes: 4 additions & 4 deletions packages/ldap-auth/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -28,10 +28,10 @@
"postpack": "backstage-cli package postpack"
},
"dependencies": {
"@backstage/core-components": "^0.13.0",
"@backstage/core-plugin-api": "^1.0.4",
"@backstage/theme": "^0.3.0",
"@material-ui/core": "^4.12.2",
"@backstage/core-components": "^0.14.0",
"@backstage/core-plugin-api": "^1.9.0",
"@backstage/theme": "^0.5.1",
"@material-ui/core": "^4.12.4",
"@react-hookz/web": "^23.0.0",
"password-validator": "^5.3.0",
"zod": "^3.17.3"
Expand Down
Loading

0 comments on commit 329b7a8

Please sign in to comment.