diff --git a/test-integration/client/issue-940.test.js b/test-integration/client/issue-940.test.js new file mode 100644 index 00000000..9c96f40c --- /dev/null +++ b/test-integration/client/issue-940.test.js @@ -0,0 +1,81 @@ +'use strict' + +const tap = require('tap') +const ldapjs = require('../../lib') +const Change = require('@ldapjs/change') + +const SCHEME = process.env.SCHEME || 'ldap' +const HOST = process.env.HOST || '127.0.0.1' +const PORT = process.env.PORT || 389 +const baseURL = `${SCHEME}://${HOST}:${PORT}` + +const client = ldapjs.createClient({ url: baseURL }) + +tap.before(() => { + return new Promise((resolve, reject) => { + client.bind('cn=admin,dc=planetexpress,dc=com', 'GoodNewsEveryone', (err) => { + if (err) { + return reject(err) + } + resolve() + }) + }) +}) + +tap.teardown(() => { + client.unbind() +}) + +tap.test('can modify entries with non-ascii chars in RDN', t => { + t.plan(6) + + const dn = 'cn=Mendonça,ou=people,dc=planetexpress,dc=com' + const entry = { + objectclass: 'person', + sn: 'change me' + } + + client.add(dn, entry, error => { + t.error(error, 'add should not error') + doSearch('change me', doModify) + }) + + function doModify () { + const change = new Change({ + operation: 'replace', + modification: { + type: 'sn', + values: ['changed'] + } + }) + + client.modify(dn, change, (error) => { + t.error(error, 'modify should not error') + doSearch('changed', t.end.bind(t)) + }) + } + + function doSearch (expected, callback) { + const searchOpts = { + filter: '(&(objectclass=person)(cn=Mendonça))', + scope: 'subtree', + attributes: ['sn'] + } + client.search('ou=people,dc=planetexpress,dc=com', searchOpts, (error, res) => { + t.error(error, 'search should not error') + + res.on('searchEntry', entry => { + const found = entry.attributes.filter(a => a.type === 'sn').pop().values.pop() + t.equal(found, expected, `expected '${expected}' and got '${found}'`) + }) + + res.on('error', error => { + t.error(error, 'search result processing should not error') + }) + + res.on('end', () => { + callback() + }) + }) + } +})