public function testScrapeProducts() { $productListUrl = new Url('http://sainsbury.com/products'); $productsDetailurls = [new Url('http://sainsbury.com/products/avocado'), new Url('http://sainsbury.com/products/apricot'), new Url('http://sainsbury.com/products/avocado-x4')]; $productListScraper = $this->prophesize('Sainsburys\\Scraper\\ProductListScraper'); $productDetailScraper = $this->prophesize('Sainsburys\\Scraper\\ProductDetailScraper'); $productListScraper->extractProductLinks($productListUrl)->shouldBeCalled()->willReturn($productsDetailurls); $productDetailScraper->extractDetail($productsDetailurls[0])->shouldBeCalled()->willReturn(new Product('Avocado', 'Best Avocado in town!', '32.23kb', Money::GBP(180))); $productDetailScraper->extractDetail($productsDetailurls[1])->shouldBeCalled()->willReturn(new Product('Apricot', 'Best Avocado in town!', '32.23kb', Money::GBP(150))); $productDetailScraper->extractDetail($productsDetailurls[2])->shouldBeCalled()->willReturn(new Product('Avocado x4', 'Great Avocado x4 deal', '32.23kb', Money::GBP(280))); $productsInfoScraper = new ProductsInfoScraper($productListScraper->reveal(), $productDetailScraper->reveal()); $products = $productsInfoScraper->extract($productListUrl); $this->assertInstanceOf('Sainsburys\\Model\\Products', $products); }
/** * @param InputInterface $input * @param OutputInterface $output */ protected function execute(InputInterface $input, OutputInterface $output) { $urlStr = $input->getArgument('url') ? $input->getArgument('url') : self::DEFAULT_URL; $url = new Url($urlStr); try { $products = $this->productsInfoScraper->extract($url); } catch (\Exception $e) { return $output->writeln('Something wrong happened: ' . $e->getMessage()); } if (!$products->hasProducts()) { return $output->writeln('No products found'); } if ($input->getOption('pretty')) { return $output->writeln(json_encode($products->toArray(), JSON_PRETTY_PRINT)); } return $output->writeln(json_encode($products->toArray())); }