# frozen_string_literal: true class AlignLogin < AutomationFramework::Utilities attr_accessor :token include Capybara::DSL # def app # @app ||= AutomationFramework::Application.instance # end def get_logged_in_bearer_token align_cookie = Capybara.current_session.driver.browser.manage.cookie_named('align')[:value] align_sig = Capybara.current_session.driver.browser.manage.cookie_named('align.sig')[:value] url = URI("#{ENV.fetch('TOPICS_URL')}/auth/token") http = Net::HTTP.new(url.host, url.port) http.use_ssl = (url.scheme == 'https') http.verify_mode = OpenSSL::SSL::VERIFY_NONE request = Net::HTTP::Post.new(url) request['Cookie'] = "align=#{align_cookie}; align.sig=#{align_sig}" response = http.request(request) JSON.parse(response.body)['accessToken'] end def login(user, app_url = url) logout visit(app_url) find('#usernameField').set(username(user)) find('button[id=nextButton]').click has_css?('#usernameField') has_css?('#passwordField', wait: 1) find('#passwordField').set(password) find('#signInButton').click has_css?('.user-name', wait: 5) set_token(user) end def login_headless(user) set_headless_browser login(user) end def logout visit("#{url}/logout") Capybara.current_session.driver.browser.manage.delete_all_cookies end def password(user = 'TOPICS') ENV.fetch(user.upcase + '_PASSWORD') end def re_enter_username?(user) return if page.find('input[id=usernameField]').value == username(user) fill_in 'usernameField', with: username(user) end def set_headless_browser(screen_width = (ENV['SCREEN_WIDTH'] || '1600'), screen_height = (ENV['SCREEN_HEIGHT'] || '1200')) Capybara.register_driver :selenium_chrome_headless do |app| o = Selenium::WebDriver::Chrome::Options .new(args: ['--headless', '--disable-gpu', '--no-sandbox', '--disable-dev-shm-usage', '--incognito', '--disable-notifications', "--window-size=#{screen_width},#{screen_height}"]) Capybara::Selenium::Driver.new(app, browser: :chrome, options: o) end Capybara.current_driver = :selenium_chrome_headless end def set_token(user) if token.is_a?(Hash) token[user] = get_logged_in_bearer_token else self.token = { user => get_logged_in_bearer_token } end end def user_token(user) if token.nil? || token.key?(user) == false login_headless(user) elsif JWT.decode(token[user], nil, false)[0]['exp'] > (Time.now + 60).to_i token[user] = token[user] else login_headless(user) end token[user] end def url(app = 'TOPICS') ENV.fetch(app.upcase + '_URL') end def username(user) ENV.fetch(user.upcase + '_USERNAME') end end