mirror of
				https://github.com/advplyr/audiobookshelf.git
				synced 2025-10-27 11:18:14 +01:00 
			
		
		
		
	Resolve some weird unrelated flakiness in BookFinder test
This commit is contained in:
		
							parent
							
								
									682a99dd43
								
							
						
					
					
						commit
						220f7ef7cd
					
				@ -22,7 +22,7 @@ describe('TitleCandidates', () => {
 | 
				
			|||||||
    })
 | 
					    })
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    describe('single add', () => {
 | 
					    describe('single add', () => {
 | 
				
			||||||
      [
 | 
					      ;[
 | 
				
			||||||
        ['adds candidate', 'anna karenina', ['anna karenina']],
 | 
					        ['adds candidate', 'anna karenina', ['anna karenina']],
 | 
				
			||||||
        ['adds lowercased candidate', 'ANNA KARENINA', ['anna karenina']],
 | 
					        ['adds lowercased candidate', 'ANNA KARENINA', ['anna karenina']],
 | 
				
			||||||
        ['adds candidate, removing redundant spaces', 'anna    karenina', ['anna karenina']],
 | 
					        ['adds candidate, removing redundant spaces', 'anna    karenina', ['anna karenina']],
 | 
				
			||||||
@ -40,23 +40,27 @@ describe('TitleCandidates', () => {
 | 
				
			|||||||
        ['adds candidate + variant, removing preceding/trailing numbers', '1 anna karenina 2', ['anna karenina', '1 anna karenina 2']],
 | 
					        ['adds candidate + variant, removing preceding/trailing numbers', '1 anna karenina 2', ['anna karenina', '1 anna karenina 2']],
 | 
				
			||||||
        ['does not add empty candidate', '', []],
 | 
					        ['does not add empty candidate', '', []],
 | 
				
			||||||
        ['does not add spaces-only candidate', '   ', []],
 | 
					        ['does not add spaces-only candidate', '   ', []],
 | 
				
			||||||
        ['does not add empty variant', '1984', ['1984']],
 | 
					        ['does not add empty variant', '1984', ['1984']]
 | 
				
			||||||
      ].forEach(([name, title, expected]) => it(name, () => {
 | 
					      ].forEach(([name, title, expected]) =>
 | 
				
			||||||
 | 
					        it(name, () => {
 | 
				
			||||||
          titleCandidates.add(title)
 | 
					          titleCandidates.add(title)
 | 
				
			||||||
          expect(titleCandidates.getCandidates()).to.deep.equal(expected)
 | 
					          expect(titleCandidates.getCandidates()).to.deep.equal(expected)
 | 
				
			||||||
      }))
 | 
					        })
 | 
				
			||||||
 | 
					      )
 | 
				
			||||||
    })
 | 
					    })
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    describe('multiple adds', () => {
 | 
					    describe('multiple adds', () => {
 | 
				
			||||||
      [
 | 
					      ;[
 | 
				
			||||||
        ['demotes digits-only candidates', ['01', 'anna karenina'], ['anna karenina', '01']],
 | 
					        ['demotes digits-only candidates', ['01', 'anna karenina'], ['anna karenina', '01']],
 | 
				
			||||||
        ['promotes transformed variants', ['title1 1', 'title2 1'], ['title1', 'title2', 'title1 1', 'title2 1']],
 | 
					        ['promotes transformed variants', ['title1 1', 'title2 1'], ['title1', 'title2', 'title1 1', 'title2 1']],
 | 
				
			||||||
        ['orders by position', ['title2', 'title1'], ['title2', 'title1']],
 | 
					        ['orders by position', ['title2', 'title1'], ['title2', 'title1']],
 | 
				
			||||||
        ['dedupes candidates', ['title1', 'title1'], ['title1']],
 | 
					        ['dedupes candidates', ['title1', 'title1'], ['title1']]
 | 
				
			||||||
      ].forEach(([name, titles, expected]) => it(name, () => {
 | 
					      ].forEach(([name, titles, expected]) =>
 | 
				
			||||||
 | 
					        it(name, () => {
 | 
				
			||||||
          for (const title of titles) titleCandidates.add(title)
 | 
					          for (const title of titles) titleCandidates.add(title)
 | 
				
			||||||
          expect(titleCandidates.getCandidates()).to.deep.equal(expected)
 | 
					          expect(titleCandidates.getCandidates()).to.deep.equal(expected)
 | 
				
			||||||
      }))
 | 
					        })
 | 
				
			||||||
 | 
					      )
 | 
				
			||||||
    })
 | 
					    })
 | 
				
			||||||
  })
 | 
					  })
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -69,12 +73,12 @@ describe('TitleCandidates', () => {
 | 
				
			|||||||
    })
 | 
					    })
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    describe('single add', () => {
 | 
					    describe('single add', () => {
 | 
				
			||||||
      [
 | 
					      ;[['adds a candidate', 'leo tolstoy', ['leo tolstoy']]].forEach(([name, title, expected]) =>
 | 
				
			||||||
        ['adds a candidate', 'leo tolstoy', ['leo tolstoy']],
 | 
					        it(name, () => {
 | 
				
			||||||
      ].forEach(([name, title, expected]) => it(name, () => {
 | 
					 | 
				
			||||||
          titleCandidates.add(title)
 | 
					          titleCandidates.add(title)
 | 
				
			||||||
          expect(titleCandidates.getCandidates()).to.deep.equal(expected)
 | 
					          expect(titleCandidates.getCandidates()).to.deep.equal(expected)
 | 
				
			||||||
      }))
 | 
					        })
 | 
				
			||||||
 | 
					      )
 | 
				
			||||||
    })
 | 
					    })
 | 
				
			||||||
  })
 | 
					  })
 | 
				
			||||||
})
 | 
					})
 | 
				
			||||||
@ -82,11 +86,7 @@ describe('TitleCandidates', () => {
 | 
				
			|||||||
describe('AuthorCandidates', () => {
 | 
					describe('AuthorCandidates', () => {
 | 
				
			||||||
  let authorCandidates
 | 
					  let authorCandidates
 | 
				
			||||||
  const audnexus = {
 | 
					  const audnexus = {
 | 
				
			||||||
    authorASINsRequest: sinon.stub().resolves([
 | 
					    authorASINsRequest: sinon.stub().resolves([{ name: 'Leo Tolstoy' }, { name: 'Nikolai Gogol' }, { name: 'J. K. Rowling' }])
 | 
				
			||||||
      { name: 'Leo Tolstoy' },
 | 
					 | 
				
			||||||
      { name: 'Nikolai Gogol' },
 | 
					 | 
				
			||||||
      { name: 'J. K. Rowling' },
 | 
					 | 
				
			||||||
    ]),
 | 
					 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  describe('cleanAuthor is null', () => {
 | 
					  describe('cleanAuthor is null', () => {
 | 
				
			||||||
@ -95,15 +95,15 @@ describe('AuthorCandidates', () => {
 | 
				
			|||||||
    })
 | 
					    })
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    describe('no adds', () => {
 | 
					    describe('no adds', () => {
 | 
				
			||||||
      [
 | 
					      ;[['returns empty author candidate', []]].forEach(([name, expected]) =>
 | 
				
			||||||
        ['returns empty author candidate', []],
 | 
					        it(name, async () => {
 | 
				
			||||||
      ].forEach(([name, expected]) => it(name, async () => {
 | 
					 | 
				
			||||||
          expect(await authorCandidates.getCandidates()).to.deep.equal([...expected, ''])
 | 
					          expect(await authorCandidates.getCandidates()).to.deep.equal([...expected, ''])
 | 
				
			||||||
      }))
 | 
					        })
 | 
				
			||||||
 | 
					      )
 | 
				
			||||||
    })
 | 
					    })
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    describe('single add', () => {
 | 
					    describe('single add', () => {
 | 
				
			||||||
      [
 | 
					      ;[
 | 
				
			||||||
        ['adds recognized candidate', 'nikolai gogol', ['nikolai gogol']],
 | 
					        ['adds recognized candidate', 'nikolai gogol', ['nikolai gogol']],
 | 
				
			||||||
        ['does not add unrecognized candidate', 'fyodor dostoevsky', []],
 | 
					        ['does not add unrecognized candidate', 'fyodor dostoevsky', []],
 | 
				
			||||||
        ['adds recognized author if candidate is a superstring', 'dr. nikolai gogol', ['nikolai gogol']],
 | 
					        ['adds recognized author if candidate is a superstring', 'dr. nikolai gogol', ['nikolai gogol']],
 | 
				
			||||||
@ -112,21 +112,25 @@ describe('AuthorCandidates', () => {
 | 
				
			|||||||
        ['does not add candidate if edit distance from any recognized author is large', 'nikolai google', []],
 | 
					        ['does not add candidate if edit distance from any recognized author is large', 'nikolai google', []],
 | 
				
			||||||
        ['adds normalized recognized candidate (contains redundant spaces)', 'nikolai    gogol', ['nikolai gogol']],
 | 
					        ['adds normalized recognized candidate (contains redundant spaces)', 'nikolai    gogol', ['nikolai gogol']],
 | 
				
			||||||
        ['adds normalized recognized candidate (et al removed)', 'nikolai gogol et al.', ['nikolai gogol']],
 | 
					        ['adds normalized recognized candidate (et al removed)', 'nikolai gogol et al.', ['nikolai gogol']],
 | 
				
			||||||
        ['adds normalized recognized candidate (normalized initials)', 'j.k. rowling', ['j. k. rowling']],
 | 
					        ['adds normalized recognized candidate (normalized initials)', 'j.k. rowling', ['j. k. rowling']]
 | 
				
			||||||
      ].forEach(([name, author, expected]) => it(name, async () => {
 | 
					      ].forEach(([name, author, expected]) =>
 | 
				
			||||||
 | 
					        it(name, async () => {
 | 
				
			||||||
          authorCandidates.add(author)
 | 
					          authorCandidates.add(author)
 | 
				
			||||||
          expect(await authorCandidates.getCandidates()).to.deep.equal([...expected, ''])
 | 
					          expect(await authorCandidates.getCandidates()).to.deep.equal([...expected, ''])
 | 
				
			||||||
      }))
 | 
					        })
 | 
				
			||||||
 | 
					      )
 | 
				
			||||||
    })
 | 
					    })
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    describe('multi add', () => {
 | 
					    describe('multi add', () => {
 | 
				
			||||||
      [
 | 
					      ;[
 | 
				
			||||||
        ['adds recognized author candidates', ['nikolai gogol', 'leo tolstoy'], ['nikolai gogol', 'leo tolstoy']],
 | 
					        ['adds recognized author candidates', ['nikolai gogol', 'leo tolstoy'], ['nikolai gogol', 'leo tolstoy']],
 | 
				
			||||||
        ['dedupes author candidates', ['nikolai gogol', 'nikolai gogol'], ['nikolai gogol']],
 | 
					        ['dedupes author candidates', ['nikolai gogol', 'nikolai gogol'], ['nikolai gogol']]
 | 
				
			||||||
      ].forEach(([name, authors, expected]) => it(name, async () => {
 | 
					      ].forEach(([name, authors, expected]) =>
 | 
				
			||||||
 | 
					        it(name, async () => {
 | 
				
			||||||
          for (const author of authors) authorCandidates.add(author)
 | 
					          for (const author of authors) authorCandidates.add(author)
 | 
				
			||||||
          expect(await authorCandidates.getCandidates()).to.deep.equal([...expected, ''])
 | 
					          expect(await authorCandidates.getCandidates()).to.deep.equal([...expected, ''])
 | 
				
			||||||
      }))
 | 
					        })
 | 
				
			||||||
 | 
					      )
 | 
				
			||||||
    })
 | 
					    })
 | 
				
			||||||
  })
 | 
					  })
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -138,21 +142,23 @@ describe('AuthorCandidates', () => {
 | 
				
			|||||||
    })
 | 
					    })
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    describe('no adds', () => {
 | 
					    describe('no adds', () => {
 | 
				
			||||||
      [
 | 
					      ;[['adds cleanAuthor as candidate', [cleanAuthor]]].forEach(([name, expected]) =>
 | 
				
			||||||
        ['adds cleanAuthor as candidate', [cleanAuthor]],
 | 
					        it(name, async () => {
 | 
				
			||||||
      ].forEach(([name, expected]) => it(name, async () => {
 | 
					 | 
				
			||||||
          expect(await authorCandidates.getCandidates()).to.deep.equal([...expected, ''])
 | 
					          expect(await authorCandidates.getCandidates()).to.deep.equal([...expected, ''])
 | 
				
			||||||
      }))
 | 
					        })
 | 
				
			||||||
 | 
					      )
 | 
				
			||||||
    })
 | 
					    })
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    describe('single add', () => {
 | 
					    describe('single add', () => {
 | 
				
			||||||
      [
 | 
					      ;[
 | 
				
			||||||
        ['adds recognized candidate', 'nikolai gogol', [cleanAuthor, 'nikolai gogol']],
 | 
					        ['adds recognized candidate', 'nikolai gogol', [cleanAuthor, 'nikolai gogol']],
 | 
				
			||||||
        ['does not add candidate if it is a dupe of cleanAuthor', cleanAuthor, [cleanAuthor]],
 | 
					        ['does not add candidate if it is a dupe of cleanAuthor', cleanAuthor, [cleanAuthor]]
 | 
				
			||||||
      ].forEach(([name, author, expected]) => it(name, async () => {
 | 
					      ].forEach(([name, author, expected]) =>
 | 
				
			||||||
 | 
					        it(name, async () => {
 | 
				
			||||||
          authorCandidates.add(author)
 | 
					          authorCandidates.add(author)
 | 
				
			||||||
          expect(await authorCandidates.getCandidates()).to.deep.equal([...expected, ''])
 | 
					          expect(await authorCandidates.getCandidates()).to.deep.equal([...expected, ''])
 | 
				
			||||||
      }))
 | 
					        })
 | 
				
			||||||
 | 
					      )
 | 
				
			||||||
    })
 | 
					    })
 | 
				
			||||||
  })
 | 
					  })
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -164,43 +170,47 @@ describe('AuthorCandidates', () => {
 | 
				
			|||||||
    })
 | 
					    })
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    describe('no adds', () => {
 | 
					    describe('no adds', () => {
 | 
				
			||||||
      [
 | 
					      ;[['adds cleanAuthor as candidate', [cleanAuthor]]].forEach(([name, expected]) =>
 | 
				
			||||||
        ['adds cleanAuthor as candidate', [cleanAuthor]],
 | 
					        it(name, async () => {
 | 
				
			||||||
      ].forEach(([name, expected]) => it(name, async () => {
 | 
					 | 
				
			||||||
          expect(await authorCandidates.getCandidates()).to.deep.equal([...expected, ''])
 | 
					          expect(await authorCandidates.getCandidates()).to.deep.equal([...expected, ''])
 | 
				
			||||||
      }))
 | 
					        })
 | 
				
			||||||
 | 
					      )
 | 
				
			||||||
    })
 | 
					    })
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    describe('single add', () => {
 | 
					    describe('single add', () => {
 | 
				
			||||||
      [
 | 
					      ;[
 | 
				
			||||||
        ['adds recognized candidate and removes cleanAuthor', 'nikolai gogol', ['nikolai gogol']],
 | 
					        ['adds recognized candidate and removes cleanAuthor', 'nikolai gogol', ['nikolai gogol']],
 | 
				
			||||||
        ['does not add unrecognized candidate', 'jackie chan', [cleanAuthor]],
 | 
					        ['does not add unrecognized candidate', 'jackie chan', [cleanAuthor]]
 | 
				
			||||||
      ].forEach(([name, author, expected]) => it(name, async () => {
 | 
					      ].forEach(([name, author, expected]) =>
 | 
				
			||||||
 | 
					        it(name, async () => {
 | 
				
			||||||
          authorCandidates.add(author)
 | 
					          authorCandidates.add(author)
 | 
				
			||||||
          expect(await authorCandidates.getCandidates()).to.deep.equal([...expected, ''])
 | 
					          expect(await authorCandidates.getCandidates()).to.deep.equal([...expected, ''])
 | 
				
			||||||
      }))
 | 
					        })
 | 
				
			||||||
 | 
					      )
 | 
				
			||||||
    })
 | 
					    })
 | 
				
			||||||
  })
 | 
					  })
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  describe('cleanAuthor is unrecognized and dirty', () => {
 | 
					  describe('cleanAuthor is unrecognized and dirty', () => {
 | 
				
			||||||
    describe('no adds', () => {
 | 
					    describe('no adds', () => {
 | 
				
			||||||
      [
 | 
					      ;[
 | 
				
			||||||
        ['adds aggressively cleaned cleanAuthor', 'fyodor dostoevsky, translated by jackie chan', ['fyodor dostoevsky']],
 | 
					        ['adds aggressively cleaned cleanAuthor', 'fyodor dostoevsky, translated by jackie chan', ['fyodor dostoevsky']],
 | 
				
			||||||
        ['adds cleanAuthor if aggresively cleaned cleanAuthor is empty', ', jackie chan', [', jackie chan']],
 | 
					        ['adds cleanAuthor if aggresively cleaned cleanAuthor is empty', ', jackie chan', [', jackie chan']]
 | 
				
			||||||
      ].forEach(([name, cleanAuthor, expected]) => it(name, async () => {
 | 
					      ].forEach(([name, cleanAuthor, expected]) =>
 | 
				
			||||||
 | 
					        it(name, async () => {
 | 
				
			||||||
          authorCandidates = new bookFinder.constructor.AuthorCandidates(cleanAuthor, audnexus)
 | 
					          authorCandidates = new bookFinder.constructor.AuthorCandidates(cleanAuthor, audnexus)
 | 
				
			||||||
          expect(await authorCandidates.getCandidates()).to.deep.equal([...expected, ''])
 | 
					          expect(await authorCandidates.getCandidates()).to.deep.equal([...expected, ''])
 | 
				
			||||||
      }))
 | 
					        })
 | 
				
			||||||
 | 
					      )
 | 
				
			||||||
    })
 | 
					    })
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    describe('single add', () => {
 | 
					    describe('single add', () => {
 | 
				
			||||||
      [
 | 
					      ;[['adds recognized candidate and removes cleanAuthor', 'fyodor dostoevsky, translated by jackie chan', 'nikolai gogol', ['nikolai gogol']]].forEach(([name, cleanAuthor, author, expected]) =>
 | 
				
			||||||
        ['adds recognized candidate and removes cleanAuthor', 'fyodor dostoevsky, translated by jackie chan', 'nikolai gogol', ['nikolai gogol']],
 | 
					        it(name, async () => {
 | 
				
			||||||
      ].forEach(([name, cleanAuthor, author, expected]) => it(name, async () => {
 | 
					 | 
				
			||||||
          authorCandidates = new bookFinder.constructor.AuthorCandidates(cleanAuthor, audnexus)
 | 
					          authorCandidates = new bookFinder.constructor.AuthorCandidates(cleanAuthor, audnexus)
 | 
				
			||||||
          authorCandidates.add(author)
 | 
					          authorCandidates.add(author)
 | 
				
			||||||
          expect(await authorCandidates.getCandidates()).to.deep.equal([...expected, ''])
 | 
					          expect(await authorCandidates.getCandidates()).to.deep.equal([...expected, ''])
 | 
				
			||||||
      }))
 | 
					        })
 | 
				
			||||||
 | 
					      )
 | 
				
			||||||
    })
 | 
					    })
 | 
				
			||||||
  })
 | 
					  })
 | 
				
			||||||
})
 | 
					})
 | 
				
			||||||
@ -211,16 +221,21 @@ describe('search', () => {
 | 
				
			|||||||
  const u = 'unrecognized'
 | 
					  const u = 'unrecognized'
 | 
				
			||||||
  const r = ['book']
 | 
					  const r = ['book']
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  const runSearchStub = sinon.stub(bookFinder, 'runSearch')
 | 
					  let runSearchStub
 | 
				
			||||||
 | 
					  let audnexusStub
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  beforeEach(() => {
 | 
				
			||||||
 | 
					    runSearchStub = sinon.stub(bookFinder, 'runSearch')
 | 
				
			||||||
    runSearchStub.resolves([])
 | 
					    runSearchStub.resolves([])
 | 
				
			||||||
    runSearchStub.withArgs(t, a).resolves(r)
 | 
					    runSearchStub.withArgs(t, a).resolves(r)
 | 
				
			||||||
    runSearchStub.withArgs(t, u).resolves(r)
 | 
					    runSearchStub.withArgs(t, u).resolves(r)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  const audnexusStub = sinon.stub(bookFinder.audnexus, 'authorASINsRequest')
 | 
					    audnexusStub = sinon.stub(bookFinder.audnexus, 'authorASINsRequest')
 | 
				
			||||||
    audnexusStub.resolves([{ name: a }])
 | 
					    audnexusStub.resolves([{ name: a }])
 | 
				
			||||||
 | 
					  })
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  beforeEach(() => {
 | 
					  afterEach(() => {
 | 
				
			||||||
    bookFinder.runSearch.resetHistory()
 | 
					    sinon.restore()
 | 
				
			||||||
  })
 | 
					  })
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  describe('search title is empty', () => {
 | 
					  describe('search title is empty', () => {
 | 
				
			||||||
@ -238,50 +253,26 @@ describe('search', () => {
 | 
				
			|||||||
  })
 | 
					  })
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  describe('search title contains recognized title and search author is a recognized author', () => {
 | 
					  describe('search title contains recognized title and search author is a recognized author', () => {
 | 
				
			||||||
    [
 | 
					    ;[[`${t} -`], [`${t} - ${a}`], [`${a} - ${t}`], [`${t}- ${a}`], [`${t} -${a}`], [`${t} ${a}`], [`${a} - ${t} (unabridged)`], [`${a} - ${t} (subtitle) - mp3`], [`${t} {narrator} - series-01 64kbps 10:00:00`], [`${a} - ${t} (2006) narrated by narrator [unabridged]`], [`${t} - ${a} 2022 mp3`], [`01 ${t}`], [`2022_${t}_HQ`]].forEach(([searchTitle]) => {
 | 
				
			||||||
      [`${t} -`],
 | 
					 | 
				
			||||||
      [`${t} - ${a}`],
 | 
					 | 
				
			||||||
      [`${a} - ${t}`],
 | 
					 | 
				
			||||||
      [`${t}- ${a}`],
 | 
					 | 
				
			||||||
      [`${t} -${a}`],
 | 
					 | 
				
			||||||
      [`${t} ${a}`],
 | 
					 | 
				
			||||||
      [`${a} - ${t} (unabridged)`],
 | 
					 | 
				
			||||||
      [`${a} - ${t} (subtitle) - mp3`],
 | 
					 | 
				
			||||||
      [`${t} {narrator} - series-01 64kbps 10:00:00`],
 | 
					 | 
				
			||||||
      [`${a} - ${t} (2006) narrated by narrator [unabridged]`],
 | 
					 | 
				
			||||||
      [`${t} - ${a} 2022 mp3`],
 | 
					 | 
				
			||||||
      [`01 ${t}`],
 | 
					 | 
				
			||||||
      [`2022_${t}_HQ`],
 | 
					 | 
				
			||||||
    ].forEach(([searchTitle]) => {
 | 
					 | 
				
			||||||
      it(`search('${searchTitle}', '${a}') returns non-empty result (with 1 fuzzy search)`, async () => {
 | 
					      it(`search('${searchTitle}', '${a}') returns non-empty result (with 1 fuzzy search)`, async () => {
 | 
				
			||||||
        expect(await bookFinder.search(null, '', searchTitle, a)).to.deep.equal(r)
 | 
					        expect(await bookFinder.search(null, '', searchTitle, a)).to.deep.equal(r)
 | 
				
			||||||
        sinon.assert.callCount(bookFinder.runSearch, 2)
 | 
					        sinon.assert.callCount(bookFinder.runSearch, 2)
 | 
				
			||||||
      })
 | 
					      })
 | 
				
			||||||
    });
 | 
					    })
 | 
				
			||||||
 | 
					    ;[[`s-01 - ${t} (narrator) 64kbps 10:00:00`], [`${a} - series 01 - ${t}`]].forEach(([searchTitle]) => {
 | 
				
			||||||
    [
 | 
					 | 
				
			||||||
      [`s-01 - ${t} (narrator) 64kbps 10:00:00`],
 | 
					 | 
				
			||||||
      [`${a} - series 01 - ${t}`],
 | 
					 | 
				
			||||||
    ].forEach(([searchTitle]) => {
 | 
					 | 
				
			||||||
      it(`search('${searchTitle}', '${a}') returns non-empty result (with 2 fuzzy searches)`, async () => {
 | 
					      it(`search('${searchTitle}', '${a}') returns non-empty result (with 2 fuzzy searches)`, async () => {
 | 
				
			||||||
        expect(await bookFinder.search(null, '', searchTitle, a)).to.deep.equal(r)
 | 
					        expect(await bookFinder.search(null, '', searchTitle, a)).to.deep.equal(r)
 | 
				
			||||||
        sinon.assert.callCount(bookFinder.runSearch, 3)
 | 
					        sinon.assert.callCount(bookFinder.runSearch, 3)
 | 
				
			||||||
      })
 | 
					      })
 | 
				
			||||||
    });
 | 
					    })
 | 
				
			||||||
 | 
					    ;[[`${t}-${a}`], [`${t} junk`]].forEach(([searchTitle]) => {
 | 
				
			||||||
    [
 | 
					 | 
				
			||||||
      [`${t}-${a}`],
 | 
					 | 
				
			||||||
      [`${t} junk`],
 | 
					 | 
				
			||||||
    ].forEach(([searchTitle]) => {
 | 
					 | 
				
			||||||
      it(`search('${searchTitle}', '${a}') returns an empty result`, async () => {
 | 
					      it(`search('${searchTitle}', '${a}') returns an empty result`, async () => {
 | 
				
			||||||
        expect(await bookFinder.search(null, '', searchTitle, a)).to.deep.equal([])
 | 
					        expect(await bookFinder.search(null, '', searchTitle, a)).to.deep.equal([])
 | 
				
			||||||
      })
 | 
					      })
 | 
				
			||||||
    })
 | 
					    })
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    describe('maxFuzzySearches = 0', () => {
 | 
					    describe('maxFuzzySearches = 0', () => {
 | 
				
			||||||
      [
 | 
					      ;[[`${t} - ${a}`]].forEach(([searchTitle]) => {
 | 
				
			||||||
        [`${t} - ${a}`],
 | 
					 | 
				
			||||||
      ].forEach(([searchTitle]) => {
 | 
					 | 
				
			||||||
        it(`search('${searchTitle}', '${a}') returns an empty result (with no fuzzy searches)`, async () => {
 | 
					        it(`search('${searchTitle}', '${a}') returns an empty result (with no fuzzy searches)`, async () => {
 | 
				
			||||||
          expect(await bookFinder.search(null, '', searchTitle, a, null, null, { maxFuzzySearches: 0 })).to.deep.equal([])
 | 
					          expect(await bookFinder.search(null, '', searchTitle, a, null, null, { maxFuzzySearches: 0 })).to.deep.equal([])
 | 
				
			||||||
          sinon.assert.callCount(bookFinder.runSearch, 1)
 | 
					          sinon.assert.callCount(bookFinder.runSearch, 1)
 | 
				
			||||||
@ -290,10 +281,7 @@ describe('search', () => {
 | 
				
			|||||||
    })
 | 
					    })
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    describe('maxFuzzySearches = 1', () => {
 | 
					    describe('maxFuzzySearches = 1', () => {
 | 
				
			||||||
      [
 | 
					      ;[[`s-01 - ${t} (narrator) 64kbps 10:00:00`], [`${a} - series 01 - ${t}`]].forEach(([searchTitle]) => {
 | 
				
			||||||
        [`s-01 - ${t} (narrator) 64kbps 10:00:00`],
 | 
					 | 
				
			||||||
        [`${a} - series 01 - ${t}`],
 | 
					 | 
				
			||||||
      ].forEach(([searchTitle]) => {
 | 
					 | 
				
			||||||
        it(`search('${searchTitle}', '${a}') returns an empty result (1 fuzzy search)`, async () => {
 | 
					        it(`search('${searchTitle}', '${a}') returns an empty result (1 fuzzy search)`, async () => {
 | 
				
			||||||
          expect(await bookFinder.search(null, '', searchTitle, a, null, null, { maxFuzzySearches: 1 })).to.deep.equal([])
 | 
					          expect(await bookFinder.search(null, '', searchTitle, a, null, null, { maxFuzzySearches: 1 })).to.deep.equal([])
 | 
				
			||||||
          sinon.assert.callCount(bookFinder.runSearch, 2)
 | 
					          sinon.assert.callCount(bookFinder.runSearch, 2)
 | 
				
			||||||
@ -303,21 +291,13 @@ describe('search', () => {
 | 
				
			|||||||
  })
 | 
					  })
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  describe('search title contains recognized title and search author is empty', () => {
 | 
					  describe('search title contains recognized title and search author is empty', () => {
 | 
				
			||||||
    [
 | 
					    ;[[`${t} - ${a}`], [`${a} - ${t}`]].forEach(([searchTitle]) => {
 | 
				
			||||||
      [`${t} - ${a}`],
 | 
					 | 
				
			||||||
      [`${a} - ${t}`],
 | 
					 | 
				
			||||||
    ].forEach(([searchTitle]) => {
 | 
					 | 
				
			||||||
      it(`search('${searchTitle}', '') returns a non-empty result (1 fuzzy search)`, async () => {
 | 
					      it(`search('${searchTitle}', '') returns a non-empty result (1 fuzzy search)`, async () => {
 | 
				
			||||||
        expect(await bookFinder.search(null, '', searchTitle, '')).to.deep.equal(r)
 | 
					        expect(await bookFinder.search(null, '', searchTitle, '')).to.deep.equal(r)
 | 
				
			||||||
        sinon.assert.callCount(bookFinder.runSearch, 2)
 | 
					        sinon.assert.callCount(bookFinder.runSearch, 2)
 | 
				
			||||||
      })
 | 
					      })
 | 
				
			||||||
    });
 | 
					    })
 | 
				
			||||||
 | 
					    ;[[`${t}`], [`${t} - ${u}`], [`${u} - ${t}`]].forEach(([searchTitle]) => {
 | 
				
			||||||
    [
 | 
					 | 
				
			||||||
      [`${t}`],
 | 
					 | 
				
			||||||
      [`${t} - ${u}`],
 | 
					 | 
				
			||||||
      [`${u} - ${t}`]
 | 
					 | 
				
			||||||
    ].forEach(([searchTitle]) => {
 | 
					 | 
				
			||||||
      it(`search('${searchTitle}', '') returns an empty result`, async () => {
 | 
					      it(`search('${searchTitle}', '') returns an empty result`, async () => {
 | 
				
			||||||
        expect(await bookFinder.search(null, '', searchTitle, '')).to.deep.equal([])
 | 
					        expect(await bookFinder.search(null, '', searchTitle, '')).to.deep.equal([])
 | 
				
			||||||
      })
 | 
					      })
 | 
				
			||||||
@ -325,19 +305,13 @@ describe('search', () => {
 | 
				
			|||||||
  })
 | 
					  })
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  describe('search title contains recognized title and search author is an unrecognized author', () => {
 | 
					  describe('search title contains recognized title and search author is an unrecognized author', () => {
 | 
				
			||||||
    [
 | 
					    ;[[`${t} - ${u}`], [`${u} - ${t}`]].forEach(([searchTitle]) => {
 | 
				
			||||||
      [`${t} - ${u}`],
 | 
					 | 
				
			||||||
      [`${u} - ${t}`]
 | 
					 | 
				
			||||||
    ].forEach(([searchTitle]) => {
 | 
					 | 
				
			||||||
      it(`search('${searchTitle}', '${u}') returns a non-empty result (1 fuzzy search)`, async () => {
 | 
					      it(`search('${searchTitle}', '${u}') returns a non-empty result (1 fuzzy search)`, async () => {
 | 
				
			||||||
        expect(await bookFinder.search(null, '', searchTitle, u)).to.deep.equal(r)
 | 
					        expect(await bookFinder.search(null, '', searchTitle, u)).to.deep.equal(r)
 | 
				
			||||||
        sinon.assert.callCount(bookFinder.runSearch, 2)
 | 
					        sinon.assert.callCount(bookFinder.runSearch, 2)
 | 
				
			||||||
      })
 | 
					      })
 | 
				
			||||||
    });
 | 
					    })
 | 
				
			||||||
 | 
					    ;[[`${t}`]].forEach(([searchTitle]) => {
 | 
				
			||||||
    [
 | 
					 | 
				
			||||||
      [`${t}`]
 | 
					 | 
				
			||||||
    ].forEach(([searchTitle]) => {
 | 
					 | 
				
			||||||
      it(`search('${searchTitle}', '${u}') returns a non-empty result (no fuzzy search)`, async () => {
 | 
					      it(`search('${searchTitle}', '${u}') returns a non-empty result (no fuzzy search)`, async () => {
 | 
				
			||||||
        expect(await bookFinder.search(null, '', searchTitle, u)).to.deep.equal(r)
 | 
					        expect(await bookFinder.search(null, '', searchTitle, u)).to.deep.equal(r)
 | 
				
			||||||
        sinon.assert.callCount(bookFinder.runSearch, 1)
 | 
					        sinon.assert.callCount(bookFinder.runSearch, 1)
 | 
				
			||||||
@ -350,7 +324,10 @@ describe('search', () => {
 | 
				
			|||||||
    const provider = 'audible'
 | 
					    const provider = 'audible'
 | 
				
			||||||
    const unsorted = [{ duration: 3000 }, { duration: 2000 }, { duration: 1000 }, { duration: 500 }]
 | 
					    const unsorted = [{ duration: 3000 }, { duration: 2000 }, { duration: 1000 }, { duration: 500 }]
 | 
				
			||||||
    const sorted = [{ duration: 1000 }, { duration: 500 }, { duration: 2000 }, { duration: 3000 }]
 | 
					    const sorted = [{ duration: 1000 }, { duration: 500 }, { duration: 2000 }, { duration: 3000 }]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    beforeEach(() => {
 | 
				
			||||||
      runSearchStub.withArgs(t, a, provider).resolves(unsorted)
 | 
					      runSearchStub.withArgs(t, a, provider).resolves(unsorted)
 | 
				
			||||||
 | 
					    })
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    it('returns results sorted by library item duration diff', async () => {
 | 
					    it('returns results sorted by library item duration diff', async () => {
 | 
				
			||||||
      expect(await bookFinder.search(libraryItem, provider, t, a)).to.deep.equal(sorted)
 | 
					      expect(await bookFinder.search(libraryItem, provider, t, a)).to.deep.equal(sorted)
 | 
				
			||||||
@ -365,10 +342,10 @@ describe('search', () => {
 | 
				
			|||||||
    })
 | 
					    })
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    it('returns unsorted results if library item media is undefined', async () => {
 | 
					    it('returns unsorted results if library item media is undefined', async () => {
 | 
				
			||||||
      expect(await bookFinder.search({ }, provider, t, a)).to.deep.equal(unsorted)
 | 
					      expect(await bookFinder.search({}, provider, t, a)).to.deep.equal(unsorted)
 | 
				
			||||||
    })
 | 
					    })
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    it ('should return a result last if it has no duration', async () => {
 | 
					    it('should return a result last if it has no duration', async () => {
 | 
				
			||||||
      const unsorted = [{}, { duration: 3000 }, { duration: 2000 }, { duration: 1000 }, { duration: 500 }]
 | 
					      const unsorted = [{}, { duration: 3000 }, { duration: 2000 }, { duration: 1000 }, { duration: 500 }]
 | 
				
			||||||
      const sorted = [{ duration: 1000 }, { duration: 500 }, { duration: 2000 }, { duration: 3000 }, {}]
 | 
					      const sorted = [{ duration: 1000 }, { duration: 500 }, { duration: 2000 }, { duration: 3000 }, {}]
 | 
				
			||||||
      runSearchStub.withArgs(t, a, provider).resolves(unsorted)
 | 
					      runSearchStub.withArgs(t, a, provider).resolves(unsorted)
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
		Reference in New Issue
	
	Block a user