@@ -1722,6 +1722,79 @@ describe('BasicCrawler', () => {
17221722 expect ( addRequestsBatchedSpy ) . toHaveBeenCalledOnce ( ) ;
17231723 } ) ;
17241724
1725+ test ( 'enqueueLinks should respect custom user-agent robots.txt rules' , async ( ) => {
1726+ const requestQueue = await RequestQueue . open ( ) ;
1727+ const visitedUrls : string [ ] = [ ] ;
1728+
1729+ const crawler = new ( class MockedRobotsTxtCrawler extends BasicCrawler {
1730+ override async getRobotsTxtFileForUrl ( _ : string ) {
1731+ return RobotsTxtFile . from (
1732+ 'http://example.com/robots.txt' ,
1733+ `User-agent: *
1734+ Disallow: /
1735+ Allow: /yes
1736+
1737+ User-agent: MyCrawler
1738+ Disallow: /no
1739+ Allow: /my-crawler
1740+ ` ,
1741+ ) ;
1742+ }
1743+ } ) ( {
1744+ requestQueue,
1745+ maxConcurrency : 1 ,
1746+ respectRobotsTxtFile : { userAgent : 'MyCrawler' } ,
1747+ requestHandler : async ( context ) => {
1748+ visitedUrls . push ( context . request . url ) ;
1749+
1750+ if ( context . request . label ) {
1751+ return ;
1752+ }
1753+
1754+ await context . enqueueLinks ( {
1755+ urls : [
1756+ 'http://example.com/yes' ,
1757+ 'http://example.com/no' ,
1758+ 'http://example.com/no-globally' ,
1759+ 'http://example.com/my-crawler/anything' ,
1760+ ] ,
1761+ label : 'child' ,
1762+ } ) ;
1763+ } ,
1764+ } ) ;
1765+
1766+ await crawler . run ( [ 'http://example.com/start' ] ) ;
1767+
1768+ expect ( visitedUrls ) . toEqual ( [
1769+ 'http://example.com/start' ,
1770+ 'http://example.com/yes' ,
1771+ 'http://example.com/my-crawler/anything' ,
1772+ ] ) ;
1773+ } ) ;
1774+
1775+ test ( 'enqueueLinks forwards respectRobotsTxtFile.userAgent to the robots.txt check' , async ( ) => {
1776+ const requestQueue = await RequestQueue . open ( ) ;
1777+ const isAllowedSpy = vitest . fn ( ( ) => true ) ;
1778+
1779+ const crawler = new ( class MockedRobotsTxtCrawler extends BasicCrawler {
1780+ override async getRobotsTxtFileForUrl ( _ : string ) {
1781+ return { isAllowed : isAllowedSpy } as unknown as RobotsTxtFile ;
1782+ }
1783+ } ) ( {
1784+ requestQueue,
1785+ maxConcurrency : 1 ,
1786+ respectRobotsTxtFile : { userAgent : 'MyCrawler' } ,
1787+ requestHandler : async ( context ) => {
1788+ if ( context . request . label ) return ;
1789+ await context . enqueueLinks ( { urls : [ 'http://example.com/child' ] , label : 'child' } ) ;
1790+ } ,
1791+ } ) ;
1792+
1793+ await crawler . run ( [ 'http://example.com/start' ] ) ;
1794+
1795+ expect ( isAllowedSpy ) . toHaveBeenCalledWith ( 'http://example.com/child' , 'MyCrawler' ) ;
1796+ } ) ;
1797+
17251798 test ( 'enqueueLinks should respect maxRequestsPerCrawl' , async ( ) => {
17261799 const requestQueue = await RequestQueue . open ( ) ;
17271800 const addRequestsBatchedSpy = vitest . spyOn ( requestQueue , 'addRequestsBatched' ) ;
0 commit comments