mirror of
				https://github.com/advplyr/audiobookshelf.git
				synced 2025-10-27 11:18:14 +01:00 
			
		
		
		
	
		
			
				
	
	
		
			100 lines
		
	
	
		
			3.4 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			100 lines
		
	
	
		
			3.4 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
const chai = require('chai')
 | 
						|
const expect = chai.expect
 | 
						|
const { parse, nameToLastFirst } = require('../../../../server/utils/parsers/parseNameString')
 | 
						|
 | 
						|
describe('parseNameString', () => {
 | 
						|
  describe('parse', () => {
 | 
						|
    it('returns null if nameString is empty', () => {
 | 
						|
      const result = parse('')
 | 
						|
      expect(result).to.be.null
 | 
						|
    })
 | 
						|
 | 
						|
    it('parses single name in First Last format', () => {
 | 
						|
      const result = parse('John Smith')
 | 
						|
      expect(result.names).to.deep.equal(['John Smith'])
 | 
						|
    })
 | 
						|
 | 
						|
    it('parses single name in Last, First format', () => {
 | 
						|
      const result = parse('Smith, John')
 | 
						|
      expect(result.names).to.deep.equal(['John Smith'])
 | 
						|
    })
 | 
						|
 | 
						|
    it('parses multiple names separated by &', () => {
 | 
						|
      const result = parse('John Smith & Jane Doe')
 | 
						|
      expect(result.names).to.deep.equal(['John Smith', 'Jane Doe'])
 | 
						|
    })
 | 
						|
 | 
						|
    it('parses multiple names separated by "and"', () => {
 | 
						|
      const result = parse('John Smith and Jane Doe')
 | 
						|
      expect(result.names).to.deep.equal(['John Smith', 'Jane Doe'])
 | 
						|
    })
 | 
						|
 | 
						|
    it('parses multiple names separated by comma and "and"', () => {
 | 
						|
      const result = parse('John Smith, Jane Doe and John Doe')
 | 
						|
      expect(result.names).to.deep.equal(['John Smith', 'Jane Doe', 'John Doe'])
 | 
						|
    })
 | 
						|
 | 
						|
    it('parses multiple names separated by semicolon', () => {
 | 
						|
      const result = parse('John Smith; Jane Doe')
 | 
						|
      expect(result.names).to.deep.equal(['John Smith', 'Jane Doe'])
 | 
						|
    })
 | 
						|
 | 
						|
    it('parses multiple names in Last, First format', () => {
 | 
						|
      const result = parse('Smith, John, Doe, Jane')
 | 
						|
      expect(result.names).to.deep.equal(['John Smith', 'Jane Doe'])
 | 
						|
    })
 | 
						|
 | 
						|
    it('parses multiple names with single word name', () => {
 | 
						|
      const result = parse('John Smith, Jones, James Doe, Ludwig von Mises')
 | 
						|
      expect(result.names).to.deep.equal(['John Smith', 'Jones', 'James Doe', 'Ludwig von Mises'])
 | 
						|
    })
 | 
						|
 | 
						|
    it('parses multiple names with single word name listed first (semicolon separator)', () => {
 | 
						|
      const result = parse('Jones; John Smith; James Doe; Ludwig von Mises')
 | 
						|
      expect(result.names).to.deep.equal(['Jones', 'John Smith', 'James Doe', 'Ludwig von Mises'])
 | 
						|
    })
 | 
						|
 | 
						|
    it('handles names with suffixes', () => {
 | 
						|
      const result = parse('Smith, John Jr.')
 | 
						|
      expect(result.names).to.deep.equal(['John Jr. Smith'])
 | 
						|
    })
 | 
						|
 | 
						|
    it('handles compound last names', () => {
 | 
						|
      const result = parse('von Mises, Ludwig')
 | 
						|
      expect(result.names).to.deep.equal(['Ludwig von Mises'])
 | 
						|
    })
 | 
						|
 | 
						|
    it('handles Chinese/Japanese/Korean names', () => {
 | 
						|
      const result = parse('张三, 李四')
 | 
						|
      expect(result.names).to.deep.equal(['张三', '李四'])
 | 
						|
    })
 | 
						|
 | 
						|
    it('removes duplicate names', () => {
 | 
						|
      const result = parse('John Smith & John Smith')
 | 
						|
      expect(result.names).to.deep.equal(['John Smith'])
 | 
						|
    })
 | 
						|
 | 
						|
    it('filters out empty names', () => {
 | 
						|
      const result = parse('John Smith,')
 | 
						|
      expect(result.names).to.deep.equal(['John Smith'])
 | 
						|
    })
 | 
						|
  })
 | 
						|
 | 
						|
  describe('nameToLastFirst', () => {
 | 
						|
    it('converts First Last to Last, First format', () => {
 | 
						|
      const result = nameToLastFirst('John Smith')
 | 
						|
      expect(result).to.equal('Smith, John')
 | 
						|
    })
 | 
						|
 | 
						|
    it('returns last name only when no first name', () => {
 | 
						|
      const result = nameToLastFirst('Smith')
 | 
						|
      expect(result).to.equal('Smith')
 | 
						|
    })
 | 
						|
 | 
						|
    it('handles names with middle names', () => {
 | 
						|
      const result = nameToLastFirst('John Middle Smith')
 | 
						|
      expect(result).to.equal('Smith, John Middle')
 | 
						|
    })
 | 
						|
  })
 | 
						|
})
 |