From 9ed9447be34fbc19ab36efa365d701c9ea5286ff Mon Sep 17 00:00:00 2001 From: Xavier MALPARTY Date: Tue, 22 Jun 2021 14:35:16 +0700 Subject: [PATCH] [#7] Rename GoogleService namespace in Google Rebase from google-search-raw --- app/services/google/client_service.rb | 29 +++++------ .../google_service/client_service_spec.rb | 8 +++ .../google_service/parser_service_spec.rb | 52 +++++++++++++++++++ 3 files changed, 74 insertions(+), 15 deletions(-) create mode 100644 spec/services/google_service/parser_service_spec.rb diff --git a/app/services/google/client_service.rb b/app/services/google/client_service.rb index 13575769..49ff458a 100644 --- a/app/services/google/client_service.rb +++ b/app/services/google/client_service.rb @@ -7,21 +7,21 @@ class ClientService BASE_SEARCH_URL = 'https://www.google.com/search' - def initialize(keyword:, lang: 'en') - @escaped_keyword = CGI.escape(keyword) - @uri = URI("#{BASE_SEARCH_URL}?q=#{@escaped_keyword}&hl=#{lang}&gl=#{lang}") + def initialize(keyword, lang = 'en') + escaped_keyword = CGI.escape(keyword) + @uri = URI("#{BASE_SEARCH_URL}?q=#{escaped_keyword}&hl=#{lang}&gl=#{lang}") end def call - result = HTTParty.get(@uri, { headers: { 'User-Agent' => USER_AGENT } }) - - return false unless valid_result? result - - result - rescue HTTParty::Error, Timeout::Error, SocketError => e - Rails.logger.error "Error: Query Google with '#{@escaped_keyword}' thrown an error: #{e}".colorize(:red) - - false + begin + @result = HTTParty.get(@uri, { headers: { 'User-Agent' => USER_AGENT } }) + rescue HTTParty::Error, Timeout::Error, SocketError => e + Rails.logger.error "Error: Query Google with keyword #{@keyword} throw an error: #{e}".colorize(:red) + @result = nil + else + validate_result + end + @result end private @@ -31,10 +31,9 @@ def call def valid_result?(result) return true if result&.response&.code == '200' - Rails.logger.warn "Warning: Query Google with '#{@escaped_keyword}' return status code #{result.response.code}" + Rails.logger.warn "Warning: Query Google with keyword #{@keyword} return status code #{@result.response.code}" .colorize(:yellow) - - false + @result = nil end end end diff --git a/spec/services/google_service/client_service_spec.rb b/spec/services/google_service/client_service_spec.rb index 02988568..d169a962 100644 --- a/spec/services/google_service/client_service_spec.rb +++ b/spec/services/google_service/client_service_spec.rb @@ -5,13 +5,21 @@ RSpec.describe Google::ClientService, type: :service do context 'when querying a simple keyword' do it 'returns an HTTParty Response', vcr: 'google_search' do +<<<<<<< HEAD result = described_class.query(FFaker::Lorem.word) +======= + result = described_class.new(FFaker::Lorem.word).call +>>>>>>> d03ca6f ([#7] Rename GoogleService namespace in Google) expect(result).to be_an_instance_of(HTTParty::Response) end it 'queries Google Search', vcr: 'google_search' do +<<<<<<< HEAD path = described_class.query(FFaker::Lorem.word).request.path +======= + path = described_class.new(FFaker::Lorem.word).call.request.path +>>>>>>> d03ca6f ([#7] Rename GoogleService namespace in Google) expect(path.to_s).to start_with('https://www.google.com/search') end diff --git a/spec/services/google_service/parser_service_spec.rb b/spec/services/google_service/parser_service_spec.rb new file mode 100644 index 00000000..81b435ad --- /dev/null +++ b/spec/services/google_service/parser_service_spec.rb @@ -0,0 +1,52 @@ +# frozen_string_literal: true + +require 'rails_helper' + +RSpec.describe Google::ParserService, type: :service do + context 'when parsing a page having 1 top ad' do + it 'counts exactly 1 top ad', vcr: 'google_search_top_ads_1' do + result = Google::ClientService.new('squarespace').call + + expect(described_class.new(result).ads_top_count).to eq(1) + end + end + + context 'when parsing a page having 3 top ads, 3 bottom ads and 14 non ad links' do + it 'counts exactly 3 top ads', vcr: 'google_search_top_ads_6' do + result = Google::ClientService.new('vpn').call + + expect(described_class.new(result).ads_top_count).to eq(3) + end + + it 'counts exactly 6 ads in total', vcr: 'google_search_top_ads_6' do + result = Google::ClientService.new('vpn').call + + expect(described_class.new(result).ads_page_count).to eq(6) + end + + it 'finds exactly the 3 top ads urls', vcr: 'google_search_top_ads_6' do + result = Google::ClientService.new('vpn').call + + expect(described_class.new(result).ads_top_url).to contain_exactly('https://cloud.google.com/free', 'https://www.expressvpn.com/', 'https://www.top10vpn.com/best-vpn-for-vietnam/') + end + + it 'counts exactly 14 non ad results', vcr: 'google_search_top_ads_6' do + result = Google::ClientService.new('vpn').call + + expect(described_class.new(result).non_ads_result_count).to eq(14) + end + + it 'gets 14 results', vcr: 'google_search_top_ads_6' do + result = Google::ClientService.new('vpn').call + + expect(described_class.new(result).non_ads_url.count).to eq(14) + end + + it 'gets exactly 113 links', vcr: 'google_search_top_ads_6' do + # Counted from cassette html raw code + result = Google::ClientService.new('vpn').call + + expect(described_class.new(result).total_link_count).to eq(113) + end + end +end