# rubocop:disable RSpec/MultipleDescribes RSpec.describe Percy, type: :feature do before(:each) do WebMock.disable_net_connect!(allow: '127.0.0.1', disallow: 'localhost') Percy._clear_cache! end describe 'snapshot', type: :feature, js: true do it 'disables when healthcheck version is incorrect' do stub_request(:get, "#{Percy::PERCY_SERVER_ADDRESS}/percy/healthcheck") .to_return(status: 200, body: '', headers: {'x-percy-core-version': '0.1.0'}) expect { Percy.snapshot(page, 'Name') } .to output("#{Percy::LABEL} Unsupported Percy CLI version, 0.1.0\n").to_stdout end it 'disables when healthcheck version is missing' do stub_request(:get, "#{Percy::PERCY_SERVER_ADDRESS}/percy/healthcheck") .to_return(status: 200, body: '', headers: {}) expect { Percy.snapshot(page, 'Name') } .to output( "#{Percy::LABEL} You may be using @percy/agent which" \ ' is no longer supported by this SDK. Please uninstall' \ ' @percy/agent and install @percy/cli instead.' \ " https://docs.percy.io/docs/migrating-to-percy-cli\n", ).to_stdout end it 'disables when healthcheck fails' do stub_request(:get, "#{Percy::PERCY_SERVER_ADDRESS}/percy/healthcheck") .to_return(status: 500, body: '', headers: {}) expect { Percy.snapshot(page, 'Name') } .to output("#{Percy::LABEL} Percy is not running, disabling snapshots\n").to_stdout end it 'disables when healthcheck fails to connect' do stub_request(:get, "#{Percy::PERCY_SERVER_ADDRESS}/percy/healthcheck") .to_raise(StandardError) expect { Percy.snapshot(page, 'Name') } .to output("#{Percy::LABEL} Percy is not running, disabling snapshots\n").to_stdout end it 'throws an error when driver is not provided' do stub_request(:get, "#{Percy::PERCY_SERVER_ADDRESS}/percy/healthcheck") .to_return(status: 500, body: '', headers: {}) expect { Percy.snapshot }.to raise_error(ArgumentError) end it 'throws an error when name is not provided' do stub_request(:get, "#{Percy::PERCY_SERVER_ADDRESS}/percy/healthcheck") .to_return(status: 500, body: '', headers: {}) expect { Percy.snapshot(page) }.to raise_error(ArgumentError) end it 'logs an error when sending a snapshot fails' do stub_request(:get, "#{Percy::PERCY_SERVER_ADDRESS}/percy/healthcheck") .to_return(status: 200, body: '', headers: {'x-percy-core-version': '1.0.0'}) stub_request(:get, "#{Percy::PERCY_SERVER_ADDRESS}/percy/dom.js") .to_return( status: 200, body: 'window.PercyDOM = { serialize: () => document.documentElement.outerHTML };', headers: {}, ) stub_request(:post, 'http://localhost:5338/percy/snapshot') .to_return(status: 200, body: '', headers: {}) expect { Percy.snapshot(page, 'Name') } .to output("#{Percy::LABEL} Could not take DOM snapshot 'Name'\n").to_stdout end it 'sends snapshots to the local server' do stub_request(:get, "#{Percy::PERCY_SERVER_ADDRESS}/percy/healthcheck") .to_return(status: 200, body: '', headers: {'x-percy-core-version': '1.0.0'}) stub_request(:get, "#{Percy::PERCY_SERVER_ADDRESS}/percy/dom.js") .to_return( status: 200, body: 'window.PercyDOM = { serialize: () => document.documentElement.outerHTML };', headers: {}, ) stub_request(:post, 'http://localhost:5338/percy/snapshot') .to_return(status: 200, body: '{"success": "true" }', headers: {}) visit 'index.html' data = Percy.snapshot(page, 'Name', widths: [944]) expect(WebMock).to have_requested(:post, "#{Percy::PERCY_SERVER_ADDRESS}/percy/snapshot") .with( body: { name: 'Name', url: 'http://127.0.0.1:3003/index.html', dom_snapshot: "