diff --git a/spec/requests/beef_test_spec.rb b/spec/requests/beef_test_spec.rb new file mode 100644 index 000000000..6626bcd3a --- /dev/null +++ b/spec/requests/beef_test_spec.rb @@ -0,0 +1,81 @@ +# +# Copyright (c) 2006-2024 Wade Alcorn - wade@bindshell.net +# Browser Exploitation Framework (BeEF) - https://beefproject.com +# See the file 'doc/COPYING' for copying permission +# +require 'spec_helper' +require 'capybara/rspec' +require_relative '../support/beef_test' + +RSpec.describe BeefTest do + let(:session) { Capybara::Session.new(:selenium) } + let(:victim) { Capybara::Session.new(:selenium) } + + before(:each) do + @pid = start_beef_server_and_wait + end + + after(:each) do + # Shutting down server + Process.kill("KILL", @pid) unless @pid.nil? + Process.wait(@pid) unless @pid.nil? # Ensure the process has exited and the port is released + @pid = nil + end + + describe '.login' do + it 'logs in successfully' do + expect(port_available?) # Check if the tcp port is open + session = BeefTest.login() + expect(session).not_to be_nil + expect(session.has_content?('Hooked Browsers', wait: 10)) + end + end + + describe '.logout' do + before(:each) do + expect(port_available?) # # Check if the tcp port is open + @session = BeefTest.login() # Ensure login before each '.logout' test + expect(@session.has_content?('Hooked Browsers', wait: 10)) + end + + it 'logs out successfully' do + expect(port_available?) # # Check if the tcp port is open + expect(@session.has_content?('Hooked Browsers', wait: 10)) + + # Log out of the session + @sessoin = BeefTest.logout(@session) + expect(@session.has_no_content?('Hooked Browsers', wait: 10)) + expect(@session.has_content?('Authentication', wait: 10)) + end + end + + describe '.save_screenshot' do + it 'saves a screenshot' do + session = Capybara::Session.new(:selenium_headless) if session.nil? + + # Ensure the new directory does not exist + outputDir = '/tmp' + directory = "#{outputDir}/#{SecureRandom.hex}/" + expect(File.directory?(directory)).to be false + + # Save the screenshot + BeefTest.save_screenshot(session, directory) + + # Ensure the screenshot was saved + expect(File.directory?(directory)).to be true + screenshot_files = Dir.glob("#{directory}/*.png") + expect(screenshot_files.empty?).to be false + + # Ensure the screenshot file is not empty and clean up + screenshot_files.each do |file| + expect(File.size(file)).to be > 0 + File.delete(file) + end + expect(Dir.glob("#{directory}/*.png").empty?).to be true + + # Remove the directory + Dir.delete(directory) + expect(File.directory?(directory)).to be false + end + end +end diff --git a/spec/support/beef_test.rb b/spec/support/beef_test.rb index a3cfe78fe..7db058326 100644 --- a/spec/support/beef_test.rb +++ b/spec/support/beef_test.rb @@ -21,7 +21,6 @@ class BeefTest session.visit(ATTACK_URL) session.has_content?('Authentication', wait: 10) - save_screenshot(session) # enter the credentials session.execute_script("document.getElementById('pass').value = '#{CGI.escapeHTML(BEEF_PASSWD)}'\;") @@ -47,13 +46,13 @@ class BeefTest session.execute_script(login_script) session.has_content?('Hooked Browsers', wait: 10) - save_screenshot(session) session end def self.logout(session) - session.click_link('Logout') + session.click_on('Logout') + session.has_content?('Authentication', wait: 10) session end