// Copyright 2011 Mark Cavage, Inc. All rights reserved. var test = require('tap').test; var uuid = require('node-uuid'); var ldap = require('../lib/index'); ///--- Globals var SOCKET = '/tmp/.' + uuid(); var SUFFIX = 'dc=' + uuid(); var client; var server; ///--- Helper function search(t, options, callback) { client.search(SUFFIX, options, function (err, res) { t.ifError(err); t.ok(res); var found = false; res.on('searchEntry', function (entry) { t.ok(entry); found = true; }); res.on('end', function () { t.ok(found); if (callback) return callback(); return t.end(); }); }); } ///--- Tests test('setup', function (t) { server = ldap.createServer(); t.ok(server); server.listen(SOCKET, function () { client = ldap.createClient({ socketPath: SOCKET }); t.ok(client); t.end(); }); server.bind('cn=root', function (req, res, next) { res.end(); return next(); }); server.search(SUFFIX, function (req, res, next) { var entry = { dn: 'cn=foo, ' + SUFFIX, attributes: { objectclass: ['person', 'top'], cn: 'Pogo Stick', sn: 'Stick', givenname: 'ogo', mail: uuid() + '@pogostick.org' } }; if (req.filter.matches(entry.attributes)) res.send(entry); res.end(); }); }); test('Evolution search filter (GH-3)', function (t) { // This is what Evolution sends, when searching for a contact 'ogo'. Wow. var filter = '(|(cn=ogo*)(givenname=ogo*)(sn=ogo*)(mail=ogo*)(member=ogo*)' + '(primaryphone=ogo*)(telephonenumber=ogo*)(homephone=ogo*)(mobile=ogo*)' + '(carphone=ogo*)(facsimiletelephonenumber=ogo*)' + '(homefacsimiletelephonenumber=ogo*)(otherphone=ogo*)' + '(otherfacsimiletelephonenumber=ogo*)(internationalisdnnumber=ogo*)' + '(pager=ogo*)(radio=ogo*)(telex=ogo*)(assistantphone=ogo*)' + '(companyphone=ogo*)(callbackphone=ogo*)(tty=ogo*)(o=ogo*)(ou=ogo*)' + '(roomnumber=ogo*)(title=ogo*)(businessrole=ogo*)(managername=ogo*)' + '(assistantname=ogo*)(postaladdress=ogo*)(l=ogo*)(st=ogo*)' + '(postofficebox=ogo*)(postalcode=ogo*)(c=ogo*)(homepostaladdress=ogo*)' + '(mozillahomelocalityname=ogo*)(mozillahomestate=ogo*)' + '(mozillahomepostalcode=ogo*)(mozillahomecountryname=ogo*)' + '(otherpostaladdress=ogo*)(jpegphoto=ogo*)(usercertificate=ogo*)' + '(labeleduri=ogo*)(displayname=ogo*)(spousename=ogo*)(note=ogo*)' + '(anniversary=ogo*)(birthdate=ogo*)(mailer=ogo*)(fileas=ogo*)' + '(category=ogo*)(calcaluri=ogo*)(calfburl=ogo*)(icscalendar=ogo*))'; return search(t, filter); }); test('GH-49 Client errors on bad attributes', function (t) { var searchOpts = { filter: 'cn=*ogo*', scope: 'one', attributes: 'dn' }; return search(t, searchOpts); }); test('GH-55 Client emits connect multiple times', function (t) { var c = ldap.createClient({ socketPath: SOCKET }); var count = 0; c.on('connect', function (socket) { t.ok(socket); count++; c.bind('cn=root', 'secret', function (err, res) { t.ifError(err); c.unbind(function () { t.equal(count, 1); t.end(); }); }); }); }); test('shutdown', function (t) { client.unbind(function () { server.on('close', function () { t.end(); }); server.close(); }); });