issue-860.test.js 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. 'use strict'
  2. const tap = require('tap')
  3. const ldapjs = require('../../lib')
  4. const parseDN = ldapjs.parseDN
  5. const SCHEME = process.env.SCHEME || 'ldap'
  6. const HOST = process.env.HOST || '127.0.0.1'
  7. const PORT = process.env.PORT || 389
  8. const baseURL = `${SCHEME}://${HOST}:${PORT}`
  9. const client = ldapjs.createClient({ url: baseURL })
  10. tap.before(() => {
  11. return new Promise((resolve, reject) => {
  12. client.bind('cn=admin,dc=planetexpress,dc=com', 'GoodNewsEveryone', (err) => {
  13. if (err) {
  14. return reject(err)
  15. }
  16. resolve()
  17. })
  18. })
  19. })
  20. tap.teardown(() => {
  21. client.unbind()
  22. })
  23. tap.test('can search OUs with Japanese characters', t => {
  24. t.plan(2)
  25. const opts = {
  26. filter: '(&(objectClass=person))',
  27. scope: 'sub',
  28. paged: true,
  29. sizeLimit: 100,
  30. attributes: ['cn', 'employeeID']
  31. }
  32. const baseDN = parseDN('ou=テスト,dc=planetexpress,dc=com')
  33. client.search(baseDN.toString(), opts, (err, res) => {
  34. t.error(err, 'search error')
  35. res.on('searchEntry', (entry) => {
  36. t.match(entry.pojo, {
  37. type: 'SearchResultEntry',
  38. objectName: 'cn=jdoe,ou=\\e3\\83\\86\\e3\\82\\b9\\e3\\83\\88,dc=planetexpress,dc=com',
  39. attributes: [{
  40. type: 'cn',
  41. values: ['John', 'jdoe']
  42. }]
  43. })
  44. })
  45. res.on('error', (err) => {
  46. t.error(err, 'search entry error')
  47. })
  48. res.on('end', () => {
  49. t.end()
  50. })
  51. })
  52. })
  53. tap.test('can search with non-ascii chars in filter', t => {
  54. t.plan(3)
  55. const opts = {
  56. filter: '(&(sn=Rodríguez))',
  57. scope: 'sub',
  58. attributes: ['dn', 'sn', 'cn'],
  59. type: 'user'
  60. }
  61. let searchEntryCount = 0
  62. client.search('dc=planetexpress,dc=com', opts, (err, res) => {
  63. t.error(err, 'search error')
  64. res.on('searchEntry', (entry) => {
  65. searchEntryCount += 1
  66. t.match(entry.pojo, {
  67. type: 'SearchResultEntry',
  68. objectName: 'cn=Bender Bending Rodr\\c3\\adguez,ou=people,dc=planetexpress,dc=com',
  69. attributes: [{
  70. type: 'cn',
  71. values: ['Bender Bending Rodríguez']
  72. }]
  73. })
  74. })
  75. res.on('error', (err) => {
  76. t.error(err, 'search entry error')
  77. })
  78. res.on('end', () => {
  79. t.equal(searchEntryCount, 1, 'should have found 1 entry')
  80. t.end()
  81. })
  82. })
  83. })