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 1010 end
1011 1011  
1012 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 1014 end
1015 1015  
1016 1016 private
... ...
app/models/external_person.rb
... ... @@ -103,4 +103,34 @@ class ExternalPerson < ActiveRecord::Base
103 103 def image
104 104 ExternalPerson::Image.new(avatar)
105 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 136 end
... ...
app/models/person.rb
... ... @@ -555,6 +555,34 @@ class Person < Profile
555 555 person.has_permission?(:manage_friends, self)
556 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 586 protected
559 587  
560 588 def followed_by?(profile)
... ...
app/models/user.rb
... ... @@ -386,31 +386,7 @@ class User < ApplicationRecord
386 386 end
387 387  
388 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 390 end
415 391  
416 392 def self.expires_chat_status_every
... ...
features/federated_login.feature 0 → 100644
... ... @@ -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 679 person.save!
680 680 end
681 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 8  
9 9 require File.expand_path(File.dirname(__FILE__) + '/../../config/environment')
10 10 require 'cucumber/rails'
  11 +require 'cucumber/rspec/doubles'
11 12  
12 13 Capybara.ignore_hidden_elements = true
13 14  
... ...
vendor/plugins/noosfero_caching/init.rb
... ... @@ -27,7 +27,7 @@ module NoosferoHttpCaching
27 27 end
28 28  
29 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 31 end
32 32  
33 33 class Middleware
... ...