| 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
 | require 'spec_helper'
describe User, :type => :model do
  # it { should validate_uniqueness_of :email }
  # it { should validate_presence_of :name }
  describe "SSO" do
    let(:ticket) do
      CASClient::ServiceTicket.new("ST-test", nil).tap do |ticket|
        ticket.extra_attributes = {
          :full_name         => 'john doe',
          :username          => 'john.doe',
          :email             => 'john.doe@af83.com',
          :organisation_code => '0083',
          :organisation_name => 'af83',
          :functional_scope  => "[\"STIF:CODIFLIGNE:Line:C00840\", \"STIF:CODIFLIGNE:Line:C00086\"]",
          :permissions       => []
        }
        ticket.user    = "john.doe"
        ticket.success = true
      end
    end
    context 'First time sign on' do
      it 'should create a new user if user is not registered' do
        expect{User.authenticate_with_cas_ticket(ticket)}.to change{ User.count }
        user = User.find_by(username: 'john.doe')
        expect(user.email).to eq(ticket.extra_attributes[:email])
        expect(user.name).to  eq(ticket.extra_attributes[:full_name])
      end
      it 'should create a new organisation if organisation is not present' do
        expect{User.authenticate_with_cas_ticket(ticket)}.to change{ Organisation.count }
        expect(Organisation.find_by(code: ticket.extra_attributes[:organisation_code])).to be_truthy
      end
      it 'should store organisation functional_scope' do
        User.authenticate_with_cas_ticket(ticket)
        org = Organisation.find_by(code: ticket.extra_attributes[:organisation_code])
        expect(org.sso_attributes['functional_scope']).to eq "[\"STIF:CODIFLIGNE:Line:C00840\", \"STIF:CODIFLIGNE:Line:C00086\"]"
      end
      it 'should update organisation functional_scope' do
        create :organisation, code: ticket.extra_attributes[:organisation_code], sso_attributes: {functional_scope: "[\"STIF:CODIFLIGNE:Line:C00840\"]"}
        User.authenticate_with_cas_ticket(ticket)
        org = Organisation.find_by(code: ticket.extra_attributes[:organisation_code])
        expect(org.sso_attributes['functional_scope']).to eq "[\"STIF:CODIFLIGNE:Line:C00840\", \"STIF:CODIFLIGNE:Line:C00086\"]"
      end
      it 'should not create a new organisation if organisation is already present' do
        ticket.extra_attributes[:organisation_code] = create(:organisation).code
        expect{User.authenticate_with_cas_ticket(ticket)}.not_to change{ Organisation.count }
      end
    end
    context 'Update attributes on sign on' do
      let!(:organisation) { create(:organisation) }
      let!(:user) { create(:user, username: 'john.doe', name:'fake name' , email: 'test@example.com', :organisation => organisation) }
      it 'should update user attributes on sign on' do
        User.authenticate_with_cas_ticket(ticket)
        expect(user.reload.email).to eq(ticket.extra_attributes[:email])
        expect(user.reload.name).to  eq(ticket.extra_attributes[:full_name])
      end
    end
  end
  describe "Portail sync" do
    let(:conf) { Rails.application.config.stif_portail_api }
    before :each do
      stub_request(:get, "#{conf[:url]}/api/v1/users").
        with(headers: { 'Authorization' => "Token token=\"#{conf[:key]}\"" }).
        to_return(body: File.open(File.join(Rails.root, 'spec', 'fixtures', 'users.json')), status: 200)
    end
    it 'should retrieve data from portail api' do
      expect(User.portail_api_request).to be_truthy
      expect(WebMock).to have_requested(:get, "#{conf[:url]}/api/v1/users").
        with(headers: { 'Authorization' => "Token token=\"#{conf[:key]}\"" })
    end
    it 'should create new users' do
      User.portail_sync
      expect(User.count).to eq(12)
      expect(Organisation.count).to eq(3)
    end
    it 'should update existing users' do
      create :user, username: 'alban.peignier', email:'dummy@example.com', updated_at: 10.days.ago
      User.portail_sync
      user = User.find_by(username: 'alban.peignier')
      expect(user.name).to eq('Alban Peignier')
      expect(user.email).to eq('alban.peignier@af83.com')
      expect(user.updated_at.utc).to be_within(1.second).of Time.now
      expect(user.synced_at.utc).to be_within(1.second).of Time.now
    end
    it 'should update organisation assignement' do
      create :user, username: 'alban.peignier', organisation: create(:organisation)
      User.portail_sync
      expect(User.find_by(username: 'alban.peignier').organisation.name).to eq("STIF")
    end
    it 'should update locked_at attribute' do
      create :user, username: 'alban.peignier', locked_at: Time.now
      User.portail_sync
      expect(User.find_by(username: 'alban.peignier').locked_at).to be_nil
      expect(User.find_by(username: 'jane.doe').locked_at).to eq("2016-08-05T12:34:03.995Z")
    end
    it 'should not create new user if username is already present' do
      create :user, username: 'alban.peignier'
      User.portail_sync
      expect(User.count).to eq(12)
    end
    context 'permissions' do
      it 'should give edit permissions to user if user has "edit offer" permission in portail' do
        User.portail_sync
        expect(User.find_by(username: 'vlatka.pavisic').permissions).to include_all(User.edit_offer_permissions)
        expect(User.find_by(username: 'pierre.vabre').permissions).to be_empty
      end
    end
  end
  describe "#destroy" do
    let!(:organisation){create(:organisation)}
    let!(:user){create(:user, :organisation => organisation)}
    context "user's organisation contains many user" do
      let!(:other_user){create(:user, :organisation => organisation)}
      it "should destoy also user's organisation" do
        user.destroy
        expect(Organisation.where(:name => organisation.name).exists?).to be_truthy
        read_organisation = Organisation.where(:name => organisation.name).first
        expect(read_organisation.users.count).to eq(1)
        expect(read_organisation.users.first).to eq(other_user)
      end
    end
  end
end
 |