diff --git a/source/services/member.ts b/source/services/member.ts index 5525141..b69a279 100644 --- a/source/services/member.ts +++ b/source/services/member.ts @@ -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 { + 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( diff --git a/source/tests.mocha.ts b/source/test/data.json similarity index 67% rename from source/tests.mocha.ts rename to source/test/data.json index 93b413a..13adc80 100644 --- a/source/tests.mocha.ts +++ b/source/test/data.json @@ -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; - } - >; - } - > = [ +{ + "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; - } - > = _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" + } + ] } -); +} diff --git a/source/test/main.mocha.ts b/source/test/main.mocha.ts new file mode 100644 index 0000000..aef723d --- /dev/null +++ b/source/test/main.mocha.ts @@ -0,0 +1,162 @@ +const nm_fs = require("fs"); +const nm_assert = require("assert"); + +type type_test_section = { + cases : Array; +}; + +const _data : Record = 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; + } + >; + } + >; + } = _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; + } + > = _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({}); + } + ); + } + ); + } +); diff --git a/tools/makefile b/tools/makefile index afd39f6..2c83ddc 100644 --- a/tools/makefile +++ b/tools/makefile @@ -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 $@ diff --git a/tools/test b/tools/test index 24181cd..1c8959e 100755 --- a/tools/test +++ b/tools/test @@ -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 -