Commit b2604bc640db4d9011869ff6fc7d5e778d9b6263

Authored by Caio Almeida
Committed by Larissa Reis
1 parent da3ae0ed

Ticket #195: Adding Selenium test for federated login

app/models/environment.rb
@@ -1010,7 +1010,7 @@ class Environment < ApplicationRecord @@ -1010,7 +1010,7 @@ class Environment < ApplicationRecord
1010 end 1010 end
1011 1011
1012 def has_federated_network?(domain) 1012 def has_federated_network?(domain)
1013 - self.federated_networks.map(&:url).any? {|url| /http[s]?:\/\/#{domain}\/?/ =~ url } 1013 + self.federated_networks.map(&:url).any? { |url| /http[s]?:\/\/#{domain}\/?/ =~ url }
1014 end 1014 end
1015 1015
1016 private 1016 private
app/models/external_person.rb
@@ -103,4 +103,34 @@ class ExternalPerson < ActiveRecord::Base @@ -103,4 +103,34 @@ class ExternalPerson < ActiveRecord::Base
103 def image 103 def image
104 ExternalPerson::Image.new(avatar) 104 ExternalPerson::Image.new(avatar)
105 end 105 end
  106 +
  107 + def is_template?
  108 + false
  109 + end
  110 +
  111 + def enterprises
  112 + []
  113 + end
  114 +
  115 + def friends
  116 + []
  117 + end
  118 +
  119 + def data_hash(gravatar_default = nil)
  120 + friends_list = {}
  121 + {
  122 + 'login' => self.identifier,
  123 + 'name' => self.name,
  124 + 'email' => self.email,
  125 + 'avatar' => self.profile_custom_icon(gravatar_default),
  126 + 'is_admin' => self.is_admin?,
  127 + 'since_month' => self.created_at.month,
  128 + 'since_year' => self.created_at.year,
  129 + 'email_domain' => self.source,
  130 + 'friends_list' => friends_list,
  131 + 'enterprises' => [],
  132 + 'amount_of_friends' => friends_list.count,
  133 + 'chat_enabled' => false
  134 + }
  135 + end
106 end 136 end
app/models/person.rb
@@ -555,6 +555,34 @@ class Person < Profile @@ -555,6 +555,34 @@ class Person < Profile
555 person.has_permission?(:manage_friends, self) 555 person.has_permission?(:manage_friends, self)
556 end 556 end
557 557
  558 + def data_hash(gravatar_default = nil)
  559 + friends_list = {}
  560 + enterprises = self.enterprises.map { |e| { 'name' => e.short_name, 'identifier' => e.identifier } }
  561 + self.friends.online.map do |person|
  562 + friends_list[self.identifier] = {
  563 + 'avatar' => self.profile_custom_icon(gravatar_default),
  564 + 'name' => self.short_name,
  565 + 'jid' => self.full_jid,
  566 + 'status' => self.user.chat_status,
  567 + }
  568 + end
  569 +
  570 + {
  571 + 'login' => self.identifier,
  572 + 'name' => self.name,
  573 + 'email' => self.email,
  574 + 'avatar' => self.profile_custom_icon(gravatar_default),
  575 + 'is_admin' => self.is_admin?,
  576 + 'since_month' => self.created_at.month,
  577 + 'since_year' => self.created_at.year,
  578 + 'email_domain' => self.user.enable_email ? self.user.email_domain : nil,
  579 + 'friends_list' => friends_list,
  580 + 'enterprises' => enterprises,
  581 + 'amount_of_friends' => friends_list.count,
  582 + 'chat_enabled' => self.environment.enabled?('xmpp_chat')
  583 + }
  584 + end
  585 +
558 protected 586 protected
559 587
560 def followed_by?(profile) 588 def followed_by?(profile)
app/models/user.rb
@@ -386,31 +386,7 @@ class User < ApplicationRecord @@ -386,31 +386,7 @@ class User < ApplicationRecord
386 end 386 end
387 387
388 def data_hash(gravatar_default = nil) 388 def data_hash(gravatar_default = nil)
389 - friends_list = {}  
390 - enterprises = person.enterprises.map { |e| { 'name' => e.short_name, 'identifier' => e.identifier } }  
391 - self.person.friends.online.map do |person|  
392 - friends_list[person.identifier] = {  
393 - 'avatar' => person.profile_custom_icon(gravatar_default),  
394 - 'name' => person.short_name,  
395 - 'jid' => person.full_jid,  
396 - 'status' => person.user.chat_status,  
397 - }  
398 - end  
399 -  
400 - {  
401 - 'login' => self.login,  
402 - 'name' => self.person.name,  
403 - 'email' => self.email,  
404 - 'avatar' => self.person.profile_custom_icon(gravatar_default),  
405 - 'is_admin' => self.person.is_admin?,  
406 - 'since_month' => self.person.created_at.month,  
407 - 'since_year' => self.person.created_at.year,  
408 - 'email_domain' => self.enable_email ? self.email_domain : nil,  
409 - 'friends_list' => friends_list,  
410 - 'enterprises' => enterprises,  
411 - 'amount_of_friends' => friends_list.count,  
412 - 'chat_enabled' => person.environment.enabled?('xmpp_chat')  
413 - } 389 + self.person.data_hash(gravatar_default)
414 end 390 end
415 391
416 def self.expires_chat_status_every 392 def self.expires_chat_status_every
features/federated_login.feature 0 → 100644
@@ -0,0 +1,23 @@ @@ -0,0 +1,23 @@
  1 +Feature: federated login
  2 + As a user
  3 + I want to login using an account from a federated network
  4 + In order to view pages logged in
  5 +
  6 + @selenium
  7 + Scenario: login from portal homepage
  8 + Given feature "allow_change_of_redirection_after_login" is disabled on environment
  9 + And the following federated networks
  10 + | identifier | name | url |
  11 + | test | Test | http://federated.noosfero.org |
  12 + And the following external users
  13 + | login |
  14 + | joaosilva@federated.noosfero.org |
  15 + And I am not logged in
  16 + And I go to the homepage
  17 + And I follow "Login"
  18 + And I fill in the following:
  19 + | Username / Email | joaosilva@federated.noosfero.org |
  20 + | Password | 123456 |
  21 + When I press "Log in"
  22 + Then I should be on the homepage
  23 + And I should be federated logged in as "joaosilva@federated.noosfero.org"
features/step_definitions/noosfero_steps.rb
@@ -679,3 +679,30 @@ Given /^the field (.*) is public for all users$/ do |field| @@ -679,3 +679,30 @@ Given /^the field (.*) is public for all users$/ do |field|
679 person.save! 679 person.save!
680 end 680 end
681 end 681 end
  682 +
  683 +Given /^the following external users?$/ do |table|
  684 + table.hashes.each do |item|
  685 + person_data = item.dup
  686 + username, domain = person_data['login'].split('@')
  687 + response = OpenStruct.new(
  688 + code: '200',
  689 + body: {
  690 + user: {
  691 + email: username + '@ema.il',
  692 + person: {
  693 + identifier: username,
  694 + name: username,
  695 + created_at: Time.now,
  696 + }
  697 + }
  698 + }.to_json
  699 + )
  700 + Net::HTTP.stub(:post_form).and_return(response)
  701 + end
  702 +end
  703 +
  704 +Then /^I should be federated logged in as "([^@]+)@(.+)"$/ do |username, domain|
  705 + visit '/'
  706 + url = 'http://' + domain + '/' + username
  707 + page.should have_xpath("//a[@href=\"#{url}\"]")
  708 +end
features/support/env.rb
@@ -8,6 +8,7 @@ ENV["RAILS_ENV"] ||= "cucumber" @@ -8,6 +8,7 @@ ENV["RAILS_ENV"] ||= "cucumber"
8 8
9 require File.expand_path(File.dirname(__FILE__) + '/../../config/environment') 9 require File.expand_path(File.dirname(__FILE__) + '/../../config/environment')
10 require 'cucumber/rails' 10 require 'cucumber/rails'
  11 +require 'cucumber/rspec/doubles'
11 12
12 Capybara.ignore_hidden_elements = true 13 Capybara.ignore_hidden_elements = true
13 14
vendor/plugins/noosfero_caching/init.rb
@@ -27,7 +27,7 @@ module NoosferoHttpCaching @@ -27,7 +27,7 @@ module NoosferoHttpCaching
27 end 27 end
28 28
29 def noosfero_session_check 29 def noosfero_session_check
30 - headers["X-Noosfero-Auth"] = (session[:user] != nil).to_s 30 + headers["X-Noosfero-Auth"] = (session[:user] != nil || session[:external] != nil).to_s
31 end 31 end
32 32
33 class Middleware 33 class Middleware