[add] test:service.member.export_authelia_user_file

This commit is contained in:
roydfalk 2024-05-13 10:08:43 +02:00
parent f36a48f2d3
commit 9910299675
5 changed files with 268 additions and 57 deletions

View file

@ -30,6 +30,7 @@ namespace _espe.service.member
/**
* @todo do not export
*/
export function validate_password(
password : string
@ -110,7 +111,6 @@ namespace _espe.service.member
/**
* @todo test
*/
export function name_login(
object : _espe.type.member_object
@ -475,12 +475,26 @@ namespace _espe.service.member
* @todo check validity (e.g. username characters)
*/
export async function export_authelia_user_file(
options : {
custom_data ?: (null | Array<_espe.type.member_object>);
} = {}
) : Promise<string>
{
options = Object.assign(
{
"custom_data": null,
},
options
);
const nm_yaml = require("yaml");
return lib_plankton.call.convey(
await dump(),
(
(options.custom_data !== null)
? (options.custom_data.map((member_object, index) => ({"id": index, "object": member_object})))
: await dump()
),
[
x => x.map(
entry => Object.assign(

View file

@ -1,23 +1,6 @@
const nm_assert = require("assert");
describe(
"member.validate_password",
() => {
const cases : Array<
{
name : string;
input : {
conf : any;
password : string;
};
output : Array<
{
incident : string;
details : Record<string, any>;
}
>;
}
> = [
{
"service.member.validate_password": {
"cases": [
{
"name": "minimum_length:pass",
"input": {
@ -28,7 +11,7 @@ describe(
"maximum_length": null,
"must_contain_letter": false,
"must_contain_number": false,
"must_contain_special_character": false,
"must_contain_special_character": false
}
}
},
@ -38,7 +21,7 @@ describe(
]
},
{
"name": "minimum_lengt:fail",
"name": "minimum_length:fail",
"input": {
"conf": {
"settings": {
@ -47,7 +30,7 @@ describe(
"maximum_length": null,
"must_contain_letter": false,
"must_contain_number": false,
"must_contain_special_character": false,
"must_contain_special_character": false
}
}
},
@ -73,7 +56,7 @@ describe(
"maximum_length": 5,
"must_contain_letter": false,
"must_contain_number": false,
"must_contain_special_character": false,
"must_contain_special_character": false
}
}
},
@ -92,7 +75,7 @@ describe(
"maximum_length": 5,
"must_contain_letter": false,
"must_contain_number": false,
"must_contain_special_character": false,
"must_contain_special_character": false
}
}
},
@ -118,7 +101,7 @@ describe(
"maximum_length": null,
"must_contain_letter": true,
"must_contain_number": false,
"must_contain_special_character": false,
"must_contain_special_character": false
}
}
},
@ -137,7 +120,7 @@ describe(
"maximum_length": null,
"must_contain_letter": true,
"must_contain_number": false,
"must_contain_special_character": false,
"must_contain_special_character": false
}
}
},
@ -161,7 +144,7 @@ describe(
"maximum_length": null,
"must_contain_letter": false,
"must_contain_number": true,
"must_contain_special_character": false,
"must_contain_special_character": false
}
}
},
@ -180,7 +163,7 @@ describe(
"maximum_length": null,
"must_contain_letter": false,
"must_contain_number": true,
"must_contain_special_character": false,
"must_contain_special_character": false
}
}
},
@ -204,7 +187,7 @@ describe(
"maximum_length": null,
"must_contain_letter": false,
"must_contain_number": false,
"must_contain_special_character": true,
"must_contain_special_character": true
}
}
},
@ -223,7 +206,7 @@ describe(
"maximum_length": null,
"must_contain_letter": false,
"must_contain_number": false,
"must_contain_special_character": true,
"must_contain_special_character": true
}
}
},
@ -247,7 +230,7 @@ describe(
"maximum_length": 12,
"must_contain_letter": true,
"must_contain_number": true,
"must_contain_special_character": true,
"must_contain_special_character": true
}
}
},
@ -255,24 +238,66 @@ describe(
},
"output": [
]
},
];
cases.forEach(
case_ => {
it(
case_.name,
() => {
_espe.conf.inject(case_.input.conf);
const result : Array<
{
incident : string;
details : Record<string, any>;
}
> = _espe.service.member.validate_password(case_.input.password);
nm_assert.deepEqual(result, case_.output);
}
);
}
);
]
},
"service.member.name_login": {
"cases": [
{
"name": "extension:first",
"input": {
"name_real_value": "Hans Wurst",
"name_real_index": 1
},
"output": "hans.wurst"
},
{
"name": "extension:other",
"input": {
"name_real_value": "Hans Wurst",
"name_real_index": 3
},
"output": "hans.wurst.3"
},
{
"name": "oblique",
"input": {
"name_real_value": "Käthĕ Gauß-Öhler",
"name_real_index": 2
},
"output": "kaeth_.gauss-oehler.2"
}
]
},
"service.member.export_authelia_user_file": {
"cases": [
{
"name": "oblique",
"input": {
"conf": {
"settings": {
"target_domain": "testdomain.org",
"prefix_for_numberbased_email_addresses": "wicht-"
}
},
"members": [
{
"membership_number": "1234567",
"name_real_value": "Karl Liebknecht",
"name_real_index": 1,
"email_address_private": "karl@l-haus.de",
"registered": true,
"enabled": true,
"email_use_veiled_address": true,
"email_use_nominal_address": false,
"email_redirect_to_private_address": true,
"email_allow_sending": false,
"password_image": "foobar"
}
]
},
"output": "users:\n karl.liebknecht:\n disabled: false\n displayname: Karl Liebknecht\n email: wicht-1234567@testdomain.org\n groups: []\n password: foobar\n"
}
]
}
);
}

162
source/test/main.mocha.ts Normal file
View file

@ -0,0 +1,162 @@
const nm_fs = require("fs");
const nm_assert = require("assert");
type type_test_section = {
cases : Array<any>;
};
const _data : Record<string, type_test_section> = lib_plankton.json.decode(nm_fs.readFileSync("test-data.json"));
describe(
"service.member.validate_password",
() => {
const data : {
cases : Array<
{
name : string;
input : {
conf : any;
password : string;
};
output : Array<
{
incident : string;
details : Record<string, any>;
}
>;
}
>;
} = _data["service.member.validate_password"];
data.cases.forEach(
case_ => {
it(
case_.name,
() => {
_espe.conf.inject(case_.input.conf);
const result : Array<
{
incident : string;
details : Record<string, any>;
}
> = _espe.service.member.validate_password(case_.input.password);
nm_assert.deepEqual(result, case_.output);
_espe.conf.inject({});
}
);
}
);
}
);
describe(
"service.member.name_login",
() => {
const data : {
cases : Array<
{
name : string;
input : {
name_real_value : string;
name_real_index : int;
};
output : string;
}
>;
} = _data["service.member.name_login"];
data.cases.forEach(
case_ => {
it(
case_.name,
() => {
const member_object : _espe.type.member_object = {
"membership_number": "",
"name_real_value": case_.input.name_real_value,
"name_real_index": case_.input.name_real_index,
"email_address_private": "",
"registered": false,
"enabled": false,
"email_use_veiled_address": false,
"email_use_nominal_address": false,
"email_redirect_to_private_address": false,
"email_allow_sending": false,
"password_image": null,
};
const result : string = _espe.service.member.name_login(member_object);
nm_assert.equal(result, case_.output);
}
);
}
);
}
);
describe(
"service.member.export_authelia_user_file",
() => {
const data : {
cases : Array<
{
name : string;
input : {
conf : any;
members : Array<
{
membership_number : string;
name_real_value : string;
name_real_index : int;
email_address_private : (null | string);
registered : boolean;
enabled : boolean;
email_use_veiled_address : boolean;
email_use_nominal_address : boolean;
email_redirect_to_private_address : boolean;
email_allow_sending : boolean;
password_image : (null | string);
}
>;
};
output : string;
}
>;
} = _data["service.member.export_authelia_user_file"];
data.cases.forEach(
case_ => {
it(
case_.name,
async () => {
// setup
_espe.conf.inject(case_.input.conf);
// execution
const result : string = await _espe.service.member.export_authelia_user_file(
{
"custom_data": case_.input.members.map(
member_raw => (
{
"membership_number": member_raw.membership_number,
"name_real_value": member_raw.name_real_value,
"name_real_index": member_raw.name_real_index,
"email_address_private": member_raw.email_address_private,
"registered": member_raw.registered,
"enabled": member_raw.enabled,
"email_use_veiled_address": member_raw.email_use_veiled_address,
"email_use_nominal_address": member_raw.email_use_nominal_address,
"email_redirect_to_private_address": member_raw.email_redirect_to_private_address,
"email_allow_sending": member_raw.email_allow_sending,
"password_image": member_raw.password_image,
}
)
),
}
);
// assertions
nm_assert.equal(result, case_.output);
// cleanup
_espe.conf.inject({});
}
);
}
);
}
);

View file

@ -74,13 +74,19 @@ ${dir_build}/espe: \
@ ${cmd_chmod} +x $@
.PHONY: test
test: core ${dir_build}/espe-test.mocha.js
test: core ${dir_build}/test-data.json ${dir_build}/espe-test.mocha.js
${dir_build}/test-data.json: \
${dir_source}/test/data.json
@ ${cmd_log} "test | copy data …"
@ ${cmd_mkdir} $(dir $@)
@ ${cmd_cp} -r -u -v $^ $@
${dir_temp}/espe-test-raw.js: \
${dir_lib}/plankton/plankton.d.ts \
${dir_temp}/espe-core.d.ts \
${dir_lib}/node/node_modules/@types/mocha/index.d.ts \
${dir_source}/tests.mocha.ts
${dir_source}/test/main.mocha.ts
@ ${cmd_log} "compile | test …"
@ ${cmd_mkdir} $(dir $@)
@ tsc --lib es2020 $^ --outFile $@

View file

@ -1,4 +1,8 @@
#!/usr/bin/env sh
tools/build -t
mocha build/espe-test.mocha.js
output_directory="/tmp/espe-test"
tools/build --tests --output-directory=${output_directory}
cd ${output_directory}
mocha espe-test.mocha.js
cd -