racf 0.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/.gitignore +8 -0
- data/.rspec +2 -0
- data/.travis.yml +18 -0
- data/Gemfile +14 -0
- data/Gemfile.lock +40 -0
- data/README.rdoc +56 -0
- data/Rakefile +9 -0
- data/TODO.txt +5 -0
- data/config/racf.yml.sample +27 -0
- data/lib/racf.rb +78 -0
- data/lib/racf/client.rb +138 -0
- data/lib/racf/commands/abstract_command.rb +13 -0
- data/lib/racf/commands/listgrp.rb +189 -0
- data/lib/racf/commands/listgrp/group_members_parser.rb +104 -0
- data/lib/racf/commands/listuser.rb +112 -0
- data/lib/racf/commands/rlist.rb +208 -0
- data/lib/racf/commands/search.rb +31 -0
- data/lib/racf/pagers/cached_ispf_pager.rb +91 -0
- data/lib/racf/pagers/ispf_pager.rb +57 -0
- data/lib/racf/s3270.rb +136 -0
- data/lib/racf/session.rb +149 -0
- data/lib/racf/version.rb +3 -0
- data/racf.gemspec +16 -0
- data/script/ci +3 -0
- data/spec/fixtures/config/racf.yml +9 -0
- data/spec/fixtures/listgrp/multiple_groups_multiple_members.txt +26 -0
- data/spec/fixtures/listgrp/multiple_members.txt +10 -0
- data/spec/fixtures/listgrp/no_members.txt +4 -0
- data/spec/fixtures/listgrp/not_found_groups.txt +21 -0
- data/spec/fixtures/listgrp/one_group.txt +7 -0
- data/spec/fixtures/listgrp/one_group_with_members.txt +13 -0
- data/spec/fixtures/listgrp/one_member.txt +7 -0
- data/spec/fixtures/listuser/all_users.txt +45 -0
- data/spec/fixtures/listuser/just_users_not_found.txt +3 -0
- data/spec/fixtures/listuser/one_user.txt +47 -0
- data/spec/fixtures/listuser/some_not_found_users.txt +88 -0
- data/spec/fixtures/racf_cache_dump.yml +9 -0
- data/spec/fixtures/rlist/gims.txt +135 -0
- data/spec/fixtures/rlist/gims_with_no_tims.txt +135 -0
- data/spec/fixtures/rlist/gims_with_not_found.txt +89 -0
- data/spec/fixtures/rlist/just_one_not_found.txt +1 -0
- data/spec/fixtures/rlist/multiple_not_found.txt +3 -0
- data/spec/fixtures/rlist/rlist_success.txt +50 -0
- data/spec/fixtures/rlist/tims_without_users.txt +119 -0
- data/spec/fixtures/search/gims.txt +30 -0
- data/spec/fixtures/search/tims.txt +30 -0
- data/spec/fixtures/session/screen_with_bottom_menu.txt +31 -0
- data/spec/fixtures/session/screen_with_top_and_bottom_menu.txt +47 -0
- data/spec/fixtures/session/screen_with_top_menu.txt +29 -0
- data/spec/fixtures/session/screen_without_menu.txt +13 -0
- data/spec/racf/client_spec.rb +155 -0
- data/spec/racf/commands/listgrp/group_members_parser_spec.rb +82 -0
- data/spec/racf/commands/listgrp_spec.rb +303 -0
- data/spec/racf/commands/listuser_spec.rb +123 -0
- data/spec/racf/commands/rlist_spec.rb +257 -0
- data/spec/racf/commands/search_spec.rb +66 -0
- data/spec/racf/pagers/cached_ispf_pager_spec.rb +212 -0
- data/spec/racf/pagers/ispf_pager_spec.rb +59 -0
- data/spec/racf/session_spec.rb +114 -0
- data/spec/racf_spec.rb +106 -0
- data/spec/spec_helper.rb +18 -0
- data/spec/support/helpers.rb +5 -0
- metadata +162 -0
@@ -0,0 +1,31 @@
|
|
1
|
+
INFORMATION FOR GROUP GUASI108
|
2
|
+
SUPERIOR GROUP=GUSCADFA OWNER=GUSCADFA
|
3
|
+
INSTALLATION DATA=RETIRADA MONTADORAS
|
4
|
+
NO MODEL DATA SET
|
5
|
+
TERMUACC
|
6
|
+
SUBGROUP(S)= GUTCOMEP
|
7
|
+
USER(S)= ACCESS= ACCESS COUNT= UNIVERSAL ACCESS=
|
8
|
+
AS21508 JOIN 000000 READ
|
9
|
+
CONNECT ATTRIBUTES=SPECIAL
|
10
|
+
REVOKE DATE=NONE RESUME DATE=NONE
|
11
|
+
FA21508 USE 003399 NONE
|
12
|
+
CONNECT ATTRIBUTES=NONE
|
13
|
+
REVOKE DATE=NONE RESUME DATE=NONE
|
14
|
+
Menu List Mode Functions Utilities Help
|
15
|
+
──────────────────────────────────────────────────────────────────────────────
|
16
|
+
ISPF Command Shell
|
17
|
+
Enter TSO or Workstation commands below:
|
18
|
+
===>
|
19
|
+
Place cursor on choice and press enter to Retrieve command
|
20
|
+
=> LISTGRP (GUASI108)
|
21
|
+
=> LISTGRP (GUTCOMEP)
|
22
|
+
=> LISTUSER (FA21508 AS21508)
|
23
|
+
=> LISTGRP (GUASI075 GUASI108)
|
24
|
+
=> LISTUSER (FA51838 FA20115 FA75897 FA58550 FA77095 AS04970)
|
25
|
+
=> LISTUSER (CA15833 CA06829 CD91544 CA03074 CA04281 CA04019 CA15834 CA11821 C
|
26
|
+
=> LISTUSER (CA02258 CA01465 CA11817 CA04832 CA04279 CA04147 CA04964 CA05328 C
|
27
|
+
=> LISTUSER (CA15827 CA02809 CA06953 CA04960 CA06821 CA15828 CA04144 CA04276 C
|
28
|
+
=> LISTUSER (CA01328 CA06132 CA04271 CA03064 CA15824 CA02807 CA02120 CA03065 C
|
29
|
+
=> LISTUSER (CA15002 CA02249 CA06947 CA03061 CA04006 CA11808 CA91334 CA02118 C
|
30
|
+
F1=Help F2=Split F3=Exit F7=Backward F8=Forward F9=Swap
|
31
|
+
F10=Actions F12=Cancel
|
@@ -0,0 +1,47 @@
|
|
1
|
+
Menu List Mode Functions Utilities Help
|
2
|
+
──────────────────────────────────────────────────────────────────────────────
|
3
|
+
ISPF Command Shell
|
4
|
+
Enter TSO or Workstation commands below:
|
5
|
+
===> LISTGRP (GUASI108 GUASI109)
|
6
|
+
Place cursor on choice and press enter to Retrieve command
|
7
|
+
=> LISTGRP (GUASI109)
|
8
|
+
=> LISTGRP (GUTCOMEP)
|
9
|
+
=> LISTGRP (GUASI108)
|
10
|
+
=> LISTUSER (FA21508 AS21508)
|
11
|
+
=> LISTGRP (GUASI075 GUASI108)
|
12
|
+
=> LISTUSER (FA51838 FA20115 FA75897 FA58550 FA77095 AS04970)
|
13
|
+
=> LISTUSER (CA15833 CA06829 CD91544 CA03074 CA04281 CA04019 CA15834 CA11821 C
|
14
|
+
=> LISTUSER (CA02258 CA01465 CA11817 CA04832 CA04279 CA04147 CA04964 CA05328 C
|
15
|
+
=> LISTUSER (CA15827 CA02809 CA06953 CA04960 CA06821 CA15828 CA04144 CA04276 C
|
16
|
+
=> LISTUSER (CA01328 CA06132 CA04271 CA03064 CA15824 CA02807 CA02120 CA03065 C
|
17
|
+
INFORMATION FOR GROUP GUASI108
|
18
|
+
SUPERIOR GROUP=GUSCADFA OWNER=GUSCADFA
|
19
|
+
INSTALLATION DATA=RETIRADA MONTADORAS
|
20
|
+
NO MODEL DATA SET
|
21
|
+
TERMUACC
|
22
|
+
SUBGROUP(S)= GUTCOMEP
|
23
|
+
USER(S)= ACCESS= ACCESS COUNT= UNIVERSAL ACCESS=
|
24
|
+
AS21508 JOIN 000000 READ
|
25
|
+
CONNECT ATTRIBUTES=SPECIAL
|
26
|
+
REVOKE DATE=NONE RESUME DATE=NONE
|
27
|
+
FA21508 USE 003399 NONE
|
28
|
+
CONNECT ATTRIBUTES=NONE
|
29
|
+
REVOKE DATE=NONE RESUME DATE=NONE
|
30
|
+
Menu List Mode Functions Utilities Help
|
31
|
+
──────────────────────────────────────────────────────────────────────────────
|
32
|
+
ISPF Command Shell
|
33
|
+
Enter TSO or Workstation commands below:
|
34
|
+
===>
|
35
|
+
Place cursor on choice and press enter to Retrieve command
|
36
|
+
=> LISTGRP (GUASI108 GUASI109)
|
37
|
+
=> LISTGRP (GUASI109)
|
38
|
+
=> LISTGRP (GUTCOMEP)
|
39
|
+
=> LISTGRP (GUASI108)
|
40
|
+
=> LISTUSER (FA21508 AS21508)
|
41
|
+
=> LISTGRP (GUASI075 GUASI108)
|
42
|
+
=> LISTUSER (FA51838 FA20115 FA75897 FA58550 FA77095 AS04970)
|
43
|
+
=> LISTUSER (CA15833 CA06829 CD91544 CA03074 CA04281 CA04019 CA15834 CA11821 C
|
44
|
+
=> LISTUSER (CA02258 CA01465 CA11817 CA04832 CA04279 CA04147 CA04964 CA05328 C
|
45
|
+
=> LISTUSER (CA15827 CA02809 CA06953 CA04960 CA06821 CA15828 CA04144 CA04276 C
|
46
|
+
F1=Help F2=Split F3=Exit F7=Backward F8=Forward F9=Swap
|
47
|
+
F10=Actions F12=Cancel
|
@@ -0,0 +1,29 @@
|
|
1
|
+
Menu List Mode Functions Utilities Help
|
2
|
+
──────────────────────────────────────────────────────────────────────────────
|
3
|
+
ISPF Command Shell
|
4
|
+
Enter TSO or Workstation commands below:
|
5
|
+
===> LISTGRP (GUASI108 GUASI109)
|
6
|
+
Place cursor on choice and press enter to Retrieve command
|
7
|
+
=> LISTGRP (GUASI109)
|
8
|
+
=> LISTGRP (GUTCOMEP)
|
9
|
+
=> LISTGRP (GUASI108)
|
10
|
+
=> LISTUSER (FA21508 AS21508)
|
11
|
+
=> LISTGRP (GUASI075 GUASI108)
|
12
|
+
=> LISTUSER (FA51838 FA20115 FA75897 FA58550 FA77095 AS04970)
|
13
|
+
=> LISTUSER (CA15833 CA06829 CD91544 CA03074 CA04281 CA04019 CA15834 CA11821 C
|
14
|
+
=> LISTUSER (CA02258 CA01465 CA11817 CA04832 CA04279 CA04147 CA04964 CA05328 C
|
15
|
+
=> LISTUSER (CA15827 CA02809 CA06953 CA04960 CA06821 CA15828 CA04144 CA04276 C
|
16
|
+
=> LISTUSER (CA01328 CA06132 CA04271 CA03064 CA15824 CA02807 CA02120 CA03065 C
|
17
|
+
INFORMATION FOR GROUP GUASI108
|
18
|
+
SUPERIOR GROUP=GUSCADFA OWNER=GUSCADFA
|
19
|
+
INSTALLATION DATA=RETIRADA MONTADORAS
|
20
|
+
NO MODEL DATA SET
|
21
|
+
TERMUACC
|
22
|
+
SUBGROUP(S)= GUTCOMEP
|
23
|
+
USER(S)= ACCESS= ACCESS COUNT= UNIVERSAL ACCESS=
|
24
|
+
AS21508 JOIN 000000 READ
|
25
|
+
CONNECT ATTRIBUTES=SPECIAL
|
26
|
+
REVOKE DATE=NONE RESUME DATE=NONE
|
27
|
+
FA21508 USE 003399 NONE
|
28
|
+
CONNECT ATTRIBUTES=NONE
|
29
|
+
REVOKE DATE=NONE RESUME DATE=NONE
|
@@ -0,0 +1,13 @@
|
|
1
|
+
INFORMATION FOR GROUP GUASI108
|
2
|
+
SUPERIOR GROUP=GUSCADFA OWNER=GUSCADFA
|
3
|
+
INSTALLATION DATA=RETIRADA MONTADORAS
|
4
|
+
NO MODEL DATA SET
|
5
|
+
TERMUACC
|
6
|
+
SUBGROUP(S)= GUTCOMEP
|
7
|
+
USER(S)= ACCESS= ACCESS COUNT= UNIVERSAL ACCESS=
|
8
|
+
AS21508 JOIN 000000 READ
|
9
|
+
CONNECT ATTRIBUTES=SPECIAL
|
10
|
+
REVOKE DATE=NONE RESUME DATE=NONE
|
11
|
+
FA21508 USE 003399 NONE
|
12
|
+
CONNECT ATTRIBUTES=NONE
|
13
|
+
REVOKE DATE=NONE RESUME DATE=NONE
|
@@ -0,0 +1,155 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'racf/client'
|
3
|
+
|
4
|
+
describe Racf::Client do
|
5
|
+
let(:session) { double("session") }
|
6
|
+
subject { Racf::Client.new(:session => session) }
|
7
|
+
|
8
|
+
it { should respond_to :user_id, :user_id=, :password, :password=, :server_address,
|
9
|
+
:server_address=, :server_port, :server_port=, :script_port=, :caching,
|
10
|
+
:caching=, :session, :session= }
|
11
|
+
|
12
|
+
describe "initialization" do
|
13
|
+
it "initializes with config/racf.yml" do
|
14
|
+
subject.user_id.should == "test"
|
15
|
+
subject.password.should == "secret"
|
16
|
+
subject.server_address.should == "127.0.0.1"
|
17
|
+
subject.server_port.should == 3270
|
18
|
+
subject.script_port.should == 3003
|
19
|
+
subject.caching.should == false
|
20
|
+
end
|
21
|
+
|
22
|
+
it "can be initialized with different options" do
|
23
|
+
racf = Racf::Client.new(:session => session, :user_id => "john", :caching => true, :server_port => 3333)
|
24
|
+
racf.user_id.should == "john"
|
25
|
+
racf.server_port.should == 3333
|
26
|
+
racf.caching.should == true
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
describe "#start_session" do
|
31
|
+
it "starts a racf session" do
|
32
|
+
session.should_receive(:start)
|
33
|
+
|
34
|
+
racf = Racf::Client.new(:session => session)
|
35
|
+
|
36
|
+
racf.start_session
|
37
|
+
end
|
38
|
+
|
39
|
+
it "ensures the session is finished when an exeption happens" do
|
40
|
+
session.as_null_object
|
41
|
+
session.should_receive(:finish)
|
42
|
+
|
43
|
+
racf = Racf::Client.new(:session => session)
|
44
|
+
|
45
|
+
racf.start_session { fail "error" } rescue nil
|
46
|
+
end
|
47
|
+
|
48
|
+
it "logs any exception" do
|
49
|
+
logger = double("logger").as_null_object
|
50
|
+
logger.should_receive(:error).with("error")
|
51
|
+
Racf.logger = logger
|
52
|
+
|
53
|
+
session.as_null_object
|
54
|
+
|
55
|
+
racf = Racf::Client.new(:session => session)
|
56
|
+
|
57
|
+
racf.start_session { fail "error" } rescue nil
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
describe "#finish_session" do
|
62
|
+
it "finishs a racf session" do
|
63
|
+
session.stub(:start)
|
64
|
+
session.should_receive(:finish)
|
65
|
+
|
66
|
+
racf = Racf::Client.new(:session => session)
|
67
|
+
racf.start_session
|
68
|
+
|
69
|
+
racf.finish_session
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
describe "#listgrp" do
|
74
|
+
it "calls the listgrp command class" do
|
75
|
+
session.
|
76
|
+
should_receive(:run_command).
|
77
|
+
with('LISTGRP (TEST)').
|
78
|
+
and_return("")
|
79
|
+
|
80
|
+
client = Racf::Client.new(:session => session)
|
81
|
+
|
82
|
+
client.listgrp("TEST")
|
83
|
+
end
|
84
|
+
end
|
85
|
+
|
86
|
+
describe "#listuser" do
|
87
|
+
it "calls the listuser command class" do
|
88
|
+
session.
|
89
|
+
should_receive(:run_command).
|
90
|
+
with('LISTUSER (TEST)').
|
91
|
+
and_return("")
|
92
|
+
|
93
|
+
client = Racf::Client.new(:session => session)
|
94
|
+
|
95
|
+
client.listuser("TEST")
|
96
|
+
end
|
97
|
+
end
|
98
|
+
|
99
|
+
describe "#rlist" do
|
100
|
+
it "calls the rlist command class" do
|
101
|
+
session.
|
102
|
+
should_receive(:run_command).
|
103
|
+
with('RLIST TIMS (123) AUTHUSER').
|
104
|
+
and_return("")
|
105
|
+
|
106
|
+
client = Racf::Client.new(:session => session)
|
107
|
+
|
108
|
+
client.rlist("TIMS", "123")
|
109
|
+
end
|
110
|
+
end
|
111
|
+
|
112
|
+
describe "#search" do
|
113
|
+
it "calls the search command class" do
|
114
|
+
session.
|
115
|
+
should_receive(:run_command).
|
116
|
+
with('SEARCH 123').
|
117
|
+
and_return("")
|
118
|
+
|
119
|
+
client = Racf::Client.new(:session => session)
|
120
|
+
|
121
|
+
client.search("123")
|
122
|
+
end
|
123
|
+
end
|
124
|
+
|
125
|
+
describe "#dump_cache" do
|
126
|
+
let(:f) { StringIO.new }
|
127
|
+
|
128
|
+
it "store cache in a yaml file" do
|
129
|
+
File.should_receive(:open).with(Racf.dump_file_path, 'w').and_yield(f)
|
130
|
+
subject.dump_cache
|
131
|
+
|
132
|
+
f.string.should == "--- {}\n\n"
|
133
|
+
end
|
134
|
+
end
|
135
|
+
|
136
|
+
describe "#load_cache" do
|
137
|
+
it "ignores cache if cache file not found" do
|
138
|
+
Racf.logger.should_receive(:warn).with("Could not load cache file! Running with empty cache.")
|
139
|
+
subject.load_cache
|
140
|
+
end
|
141
|
+
|
142
|
+
context "with cache file" do
|
143
|
+
before { Racf.dump_file_path = Racf.root.join("spec", "fixtures", "racf_cache_dump.yml") }
|
144
|
+
|
145
|
+
it "loads cache from fixture file" do
|
146
|
+
subject.should_receive(:cache=).
|
147
|
+
with(hash_including("Racf::Commands::Search" => {},
|
148
|
+
"Racf::Commands::Listgrp" => {},
|
149
|
+
"Racf::Commands::Rlist" => {},
|
150
|
+
"Racf::Commands::Listuser" => {}))
|
151
|
+
subject.load_cache
|
152
|
+
end
|
153
|
+
end
|
154
|
+
end
|
155
|
+
end
|
@@ -0,0 +1,82 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
require 'racf/commands/listgrp/group_members_parser'
|
4
|
+
|
5
|
+
describe Racf::Commands::Listgrp::GroupMembersParser do
|
6
|
+
context "when the group has no members" do
|
7
|
+
before do
|
8
|
+
@raw_members = File.read("spec/fixtures/listgrp/no_members.txt")
|
9
|
+
end
|
10
|
+
|
11
|
+
it "returns an empty hash" do
|
12
|
+
parser = Racf::Commands::Listgrp::GroupMembersParser.new
|
13
|
+
|
14
|
+
@raw_members.lines do |line|
|
15
|
+
parser.parse(line)
|
16
|
+
end
|
17
|
+
|
18
|
+
parser.state.should == "no_members"
|
19
|
+
parser.parsed?.should be_true
|
20
|
+
parser.members.should == {}
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
context "when the group has just one member" do
|
25
|
+
before do
|
26
|
+
@raw_members = File.read("spec/fixtures/listgrp/one_member.txt")
|
27
|
+
end
|
28
|
+
|
29
|
+
it "parses the one member attributes" do
|
30
|
+
parser = Racf::Commands::Listgrp::GroupMembersParser.new
|
31
|
+
|
32
|
+
@raw_members.lines do |line|
|
33
|
+
line.strip!
|
34
|
+
parser.parse(line)
|
35
|
+
end
|
36
|
+
|
37
|
+
parser.parsed?.should be_true
|
38
|
+
parser.state.should == "member_processed"
|
39
|
+
members = parser.members
|
40
|
+
|
41
|
+
members["CA7ONL"][:access].should == "USE"
|
42
|
+
members["CA7ONL"][:access_count].should == "000886"
|
43
|
+
members["CA7ONL"][:universal_access].should == "READ"
|
44
|
+
members["CA7ONL"][:connect_attributes].should == "NONE"
|
45
|
+
members["CA7ONL"][:revoke_date].should == "NONE"
|
46
|
+
members["CA7ONL"][:resume_date].should == "NONE"
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
context "when the group has multiple members" do
|
51
|
+
before do
|
52
|
+
@raw_members = File.read("spec/fixtures/listgrp/multiple_members.txt")
|
53
|
+
end
|
54
|
+
|
55
|
+
it "parsers multiple members attributes" do
|
56
|
+
parser = Racf::Commands::Listgrp::GroupMembersParser.new
|
57
|
+
|
58
|
+
@raw_members.lines do |line|
|
59
|
+
line.strip!
|
60
|
+
parser.parse(line)
|
61
|
+
end
|
62
|
+
|
63
|
+
parser.parsed?.should be_true
|
64
|
+
parser.state.should == "member_processed"
|
65
|
+
members = parser.members
|
66
|
+
|
67
|
+
members["CA7ONL"][:access].should == "USE"
|
68
|
+
members["CA7ONL"][:access_count].should == "000886"
|
69
|
+
members["CA7ONL"][:universal_access].should == "READ"
|
70
|
+
members["CA7ONL"][:connect_attributes].should == "NONE"
|
71
|
+
members["CA7ONL"][:revoke_date].should == "NONE"
|
72
|
+
members["CA7ONL"][:resume_date].should == "NONE"
|
73
|
+
|
74
|
+
members["CA7ICOM"][:access].should == "USE"
|
75
|
+
members["CA7ICOM"][:access_count].should == "000201"
|
76
|
+
members["CA7ICOM"][:universal_access].should == "NONE"
|
77
|
+
members["CA7ONL"][:connect_attributes].should == "NONE"
|
78
|
+
members["CA7ONL"][:revoke_date].should == "NONE"
|
79
|
+
members["CA7ONL"][:resume_date].should == "NONE"
|
80
|
+
end
|
81
|
+
end
|
82
|
+
end
|
@@ -0,0 +1,303 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
require 'racf/commands/listgrp'
|
4
|
+
|
5
|
+
describe Racf::Commands::Listgrp do
|
6
|
+
context "#extract_resources" do
|
7
|
+
it "does not fail" do
|
8
|
+
command = Racf::Commands::Listgrp.new(double("session"))
|
9
|
+
|
10
|
+
expect {
|
11
|
+
command.extract_resources
|
12
|
+
}.to_not raise_error(NotImplementedError)
|
13
|
+
end
|
14
|
+
|
15
|
+
context "when arguments are arrays" do
|
16
|
+
it "returns the group names" do
|
17
|
+
command = Racf::Commands::Listgrp.new(double("session"))
|
18
|
+
resources = command.extract_resources([['TEST1', 'TEST2']])
|
19
|
+
|
20
|
+
resources.should eq(['TEST1', 'TEST2'])
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
context "when argument is a string" do
|
25
|
+
it "returns the single group wrapped in an array" do
|
26
|
+
command = Racf::Commands::Listgrp.new(double("session"))
|
27
|
+
resources = command.extract_resources(['TEST1'])
|
28
|
+
|
29
|
+
resources.should eq(['TEST1'])
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
describe "#run" do
|
35
|
+
context "logging" do
|
36
|
+
let(:session) { double("session") }
|
37
|
+
let(:logger) { mock('Logger') }
|
38
|
+
|
39
|
+
before(:each) do
|
40
|
+
@old_logger = Racf.logger
|
41
|
+
Racf.logger = logger
|
42
|
+
|
43
|
+
scraper_raw_output = read_fixture("listgrp/one_group.txt")
|
44
|
+
|
45
|
+
session.stub(:run_command => scraper_raw_output)
|
46
|
+
end
|
47
|
+
|
48
|
+
after(:each) do
|
49
|
+
Racf.logger = @old_logger
|
50
|
+
end
|
51
|
+
|
52
|
+
it "counts correctly" do
|
53
|
+
logger.should_receive(:info).with("Processing 1 group(s)").twice
|
54
|
+
logger.should_receive(:info).with("Processing group 1 of 1 groups").twice
|
55
|
+
logger.should_receive(:info).with("\tGroup name: @PL").twice
|
56
|
+
logger.should_not_receive(:info).with("Processing group 2 of 1 groups")
|
57
|
+
|
58
|
+
command = Racf::Commands::Listgrp.new(session)
|
59
|
+
command.run("*")
|
60
|
+
command.run("*")
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
context "when the raw output has a group with no members" do
|
65
|
+
before do
|
66
|
+
scraper_raw_output = read_fixture("listgrp/one_group.txt")
|
67
|
+
@session = double("session")
|
68
|
+
@session.stub(:run_command => scraper_raw_output)
|
69
|
+
|
70
|
+
command = Racf::Commands::Listgrp.new(@session)
|
71
|
+
@groups = command.run("*")
|
72
|
+
@groups = command.run("*")
|
73
|
+
end
|
74
|
+
|
75
|
+
it "extracts the group name" do
|
76
|
+
@groups.keys.should include(:@PL)
|
77
|
+
end
|
78
|
+
|
79
|
+
it "extracts the superior group" do
|
80
|
+
@groups[:@PL][:superior_group].should == "GUHLQDSN"
|
81
|
+
end
|
82
|
+
|
83
|
+
it "extracts the owner" do
|
84
|
+
@groups[:@PL][:owner].should == "GUHLQDSN"
|
85
|
+
end
|
86
|
+
|
87
|
+
it "extracts the group description" do
|
88
|
+
@groups[:@PL][:description].should == "PROTEC. HLQ DSN"
|
89
|
+
end
|
90
|
+
|
91
|
+
it "extracts the subgroups" do
|
92
|
+
@groups[:@PL][:subgroups].should == []
|
93
|
+
end
|
94
|
+
|
95
|
+
it "extracts the group members" do
|
96
|
+
@groups[:@PL][:members].should be_empty
|
97
|
+
end
|
98
|
+
end
|
99
|
+
|
100
|
+
context "when the raw output has one group with members" do
|
101
|
+
before do
|
102
|
+
scraper_raw_output = read_fixture("listgrp/one_group_with_members.txt")
|
103
|
+
@session = double("session")
|
104
|
+
@session.stub(:run_command => scraper_raw_output)
|
105
|
+
|
106
|
+
command = Racf::Commands::Listgrp.new(@session)
|
107
|
+
@groups = command.run("*")
|
108
|
+
end
|
109
|
+
|
110
|
+
it "extracts the group name" do
|
111
|
+
@groups.keys.should include(:CA7GROUP)
|
112
|
+
end
|
113
|
+
|
114
|
+
it "extracts the superior group" do
|
115
|
+
@groups[:CA7GROUP][:superior_group].should == "GUTCPPCP"
|
116
|
+
end
|
117
|
+
|
118
|
+
it "extracts the owner" do
|
119
|
+
@groups[:CA7GROUP][:owner].should == "FA25909"
|
120
|
+
end
|
121
|
+
|
122
|
+
it "extracts the group description" do
|
123
|
+
@groups[:CA7GROUP][:description].should == "GRUPO DE CONTROLE DO CAR-7"
|
124
|
+
end
|
125
|
+
|
126
|
+
it "extracts the subgroups" do
|
127
|
+
@groups[:CA7GROUP][:subgroups].should == ["GUTDRIMT", "GUTDRIVE", "GUTDRIVV"]
|
128
|
+
end
|
129
|
+
|
130
|
+
it "extracts the group members" do
|
131
|
+
@groups[:CA7GROUP][:members].should have(2).members
|
132
|
+
|
133
|
+
@groups[:CA7GROUP][:members]["CA7ONL"][:access].should == "USE"
|
134
|
+
@groups[:CA7GROUP][:members]["CA7ONL"][:access_count].should == "000886"
|
135
|
+
@groups[:CA7GROUP][:members]["CA7ONL"][:universal_access].should == "READ"
|
136
|
+
@groups[:CA7GROUP][:members]["CA7ONL"][:connect_attributes].should == "NONE"
|
137
|
+
@groups[:CA7GROUP][:members]["CA7ONL"][:revoke_date].should == "NONE"
|
138
|
+
@groups[:CA7GROUP][:members]["CA7ONL"][:resume_date].should == "NONE"
|
139
|
+
|
140
|
+
|
141
|
+
@groups[:CA7GROUP][:members]["CA7ICOM"][:access].should == "USE"
|
142
|
+
@groups[:CA7GROUP][:members]["CA7ICOM"][:access_count].should == "000201"
|
143
|
+
@groups[:CA7GROUP][:members]["CA7ICOM"][:universal_access].should == "NONE"
|
144
|
+
@groups[:CA7GROUP][:members]["CA7ICOM"][:connect_attributes].should == "NONE"
|
145
|
+
@groups[:CA7GROUP][:members]["CA7ICOM"][:revoke_date].should == "NONE"
|
146
|
+
@groups[:CA7GROUP][:members]["CA7ICOM"][:resume_date].should == "NONE"
|
147
|
+
end
|
148
|
+
end
|
149
|
+
|
150
|
+
context "when the raw output has multiple groups with multiple members" do
|
151
|
+
before do
|
152
|
+
scraper_raw_output = read_fixture("listgrp/multiple_groups_multiple_members.txt")
|
153
|
+
@session = double("session")
|
154
|
+
@session.stub(:run_command => scraper_raw_output)
|
155
|
+
|
156
|
+
command = Racf::Commands::Listgrp.new(@session)
|
157
|
+
@groups = command.run("*")
|
158
|
+
end
|
159
|
+
|
160
|
+
it "extracts the groups' names" do
|
161
|
+
@groups.keys.should include(:CA7GROUP)
|
162
|
+
@groups.keys.should include(:SYSTRT)
|
163
|
+
end
|
164
|
+
|
165
|
+
it "extracts the superiors groups" do
|
166
|
+
@groups[:CA7GROUP][:superior_group].should == "GUTCPPCP"
|
167
|
+
@groups[:SYSTRT][:superior_group].should == "SYS1"
|
168
|
+
end
|
169
|
+
|
170
|
+
it "extracts the owners" do
|
171
|
+
@groups[:CA7GROUP][:owner].should == "FA25909"
|
172
|
+
@groups[:SYSTRT][:owner].should == "SYS1"
|
173
|
+
end
|
174
|
+
|
175
|
+
it "extracts the groups' descriptions" do
|
176
|
+
@groups[:CA7GROUP][:description].should == "GRUPO DE CONTROLE DO CAR-7"
|
177
|
+
@groups[:SYSTRT][:description].should == "NO DESCRIPTION"
|
178
|
+
end
|
179
|
+
|
180
|
+
it "extracts the subgroups" do
|
181
|
+
@groups[:CA7GROUP][:subgroups].should == ["GUTDRIMT", "GUTDRIVE"]
|
182
|
+
@groups[:SYSTRT][:subgroups].should == ["GUTDRIVE", "GUTDRIVV"]
|
183
|
+
end
|
184
|
+
|
185
|
+
it "extracts the groups' members" do
|
186
|
+
@groups[:CA7GROUP][:members].should have(2).members
|
187
|
+
|
188
|
+
@groups[:CA7GROUP][:members]["CA7ONL"][:access].should == "USE"
|
189
|
+
@groups[:CA7GROUP][:members]["CA7ONL"][:access_count].should == "000886"
|
190
|
+
@groups[:CA7GROUP][:members]["CA7ONL"][:universal_access].should == "READ"
|
191
|
+
@groups[:CA7GROUP][:members]["CA7ONL"][:connect_attributes].should == "NONE"
|
192
|
+
@groups[:CA7GROUP][:members]["CA7ONL"][:revoke_date].should == "NONE"
|
193
|
+
@groups[:CA7GROUP][:members]["CA7ONL"][:resume_date].should == "NONE"
|
194
|
+
|
195
|
+
|
196
|
+
@groups[:CA7GROUP][:members]["CA7ICOM"][:access].should == "USE"
|
197
|
+
@groups[:CA7GROUP][:members]["CA7ICOM"][:access_count].should == "000201"
|
198
|
+
@groups[:CA7GROUP][:members]["CA7ICOM"][:universal_access].should == "NONE"
|
199
|
+
@groups[:CA7GROUP][:members]["CA7ONL"][:connect_attributes].should == "NONE"
|
200
|
+
@groups[:CA7GROUP][:members]["CA7ONL"][:revoke_date].should == "NONE"
|
201
|
+
@groups[:CA7GROUP][:members]["CA7ONL"][:resume_date].should == "NONE"
|
202
|
+
|
203
|
+
|
204
|
+
|
205
|
+
@groups[:SYSTRT][:members].should have(2).members
|
206
|
+
|
207
|
+
@groups[:SYSTRT][:members]["IB00019"][:access].should == "USE"
|
208
|
+
@groups[:SYSTRT][:members]["IB00019"][:access_count].should == "000000"
|
209
|
+
@groups[:SYSTRT][:members]["IB00019"][:universal_access].should == "NONE"
|
210
|
+
@groups[:SYSTRT][:members]["IB00019"][:connect_attributes].should == "NONE"
|
211
|
+
@groups[:SYSTRT][:members]["IB00019"][:revoke_date].should == "NONE"
|
212
|
+
@groups[:SYSTRT][:members]["IB00019"][:resume_date].should == "NONE"
|
213
|
+
|
214
|
+
@groups[:SYSTRT][:members]["IB00025"][:access].should == "USE"
|
215
|
+
@groups[:SYSTRT][:members]["IB00025"][:access_count].should == "000000"
|
216
|
+
@groups[:SYSTRT][:members]["IB00025"][:universal_access].should == "NONE"
|
217
|
+
@groups[:SYSTRT][:members]["IB00025"][:connect_attributes].should == "NONE"
|
218
|
+
@groups[:SYSTRT][:members]["IB00025"][:revoke_date].should == "NONE"
|
219
|
+
@groups[:SYSTRT][:members]["IB00025"][:resume_date].should == "NONE"
|
220
|
+
end
|
221
|
+
end
|
222
|
+
|
223
|
+
context "when the raw output has groups not found" do
|
224
|
+
before do
|
225
|
+
scraper_raw_output = read_fixture("listgrp/not_found_groups.txt")
|
226
|
+
@session = double("session")
|
227
|
+
@session.stub(:run_command => scraper_raw_output)
|
228
|
+
|
229
|
+
command = Racf::Commands::Listgrp.new(@session)
|
230
|
+
@groups = command.run(["GUASI108", "GUASI075", "GUASI109"])
|
231
|
+
end
|
232
|
+
|
233
|
+
it "ignores the not found groups" do
|
234
|
+
@groups.keys.should have(2).groups
|
235
|
+
end
|
236
|
+
|
237
|
+
it "extracts the found groups' names" do
|
238
|
+
@groups.keys.should include(:GUASI108)
|
239
|
+
@groups.keys.should include(:GUASI109)
|
240
|
+
end
|
241
|
+
|
242
|
+
it "extracts the superiors groups" do
|
243
|
+
@groups[:GUASI108][:superior_group].should == "GUSCADFA"
|
244
|
+
@groups[:GUASI109][:superior_group].should == "GUSCADFA"
|
245
|
+
end
|
246
|
+
|
247
|
+
it "extracts the owners" do
|
248
|
+
@groups[:GUASI108][:owner].should == "GUSCADFA"
|
249
|
+
@groups[:GUASI109 ][:owner].should == "GUSCADFA"
|
250
|
+
end
|
251
|
+
|
252
|
+
it "extracts the groups' descriptions" do
|
253
|
+
@groups[:GUASI108][:description].should == "RETIRADA MONTADORAS"
|
254
|
+
@groups[:GUASI109][:description].should == "FIAT ALL RISK"
|
255
|
+
end
|
256
|
+
|
257
|
+
it "extracts the subgroups" do
|
258
|
+
@groups[:GUASI108][:subgroups].should == ["GUTCOMEP"]
|
259
|
+
@groups[:GUASI109][:subgroups].should be_empty
|
260
|
+
end
|
261
|
+
|
262
|
+
it "extracts the groups' members" do
|
263
|
+
@groups[:GUASI108][:members]["AS21508"][:access].should == "JOIN"
|
264
|
+
@groups[:GUASI108][:members]["AS21508"][:access_count].should == "000000"
|
265
|
+
@groups[:GUASI108][:members]["AS21508"][:universal_access].should == "READ"
|
266
|
+
@groups[:GUASI108][:members]["AS21508"][:connect_attributes].should == "SPECIAL"
|
267
|
+
@groups[:GUASI108][:members]["AS21508"][:revoke_date].should == "NONE"
|
268
|
+
@groups[:GUASI108][:members]["AS21508"][:resume_date].should == "NONE"
|
269
|
+
|
270
|
+
@groups[:GUASI108][:members]["FA21508"][:access].should == "USE"
|
271
|
+
@groups[:GUASI108][:members]["FA21508"][:access_count].should == "003391"
|
272
|
+
@groups[:GUASI108][:members]["FA21508"][:universal_access].should == "NONE"
|
273
|
+
@groups[:GUASI108][:members]["FA21508"][:connect_attributes].should == "NONE"
|
274
|
+
@groups[:GUASI108][:members]["FA21508"][:revoke_date].should == "NONE"
|
275
|
+
@groups[:GUASI108][:members]["FA21508"][:resume_date].should == "NONE"
|
276
|
+
|
277
|
+
@groups[:GUASI109][:members].should be_empty
|
278
|
+
end
|
279
|
+
end
|
280
|
+
|
281
|
+
context "running twice in a row" do
|
282
|
+
before do
|
283
|
+
one_group_raw_output = read_fixture("listgrp/one_group.txt")
|
284
|
+
multiple_groups_raw_output = read_fixture("listgrp/multiple_groups_multiple_members.txt")
|
285
|
+
|
286
|
+
@session = double("session")
|
287
|
+
|
288
|
+
@session.stub(:run_command).with("LISTGRP (@PL)") { one_group_raw_output }
|
289
|
+
@session.stub(:run_command).with("LISTGRP (CA7GROUP SYSTRT)") { multiple_groups_raw_output }
|
290
|
+
end
|
291
|
+
|
292
|
+
it "should not keep state between two calls using the same command instance" do
|
293
|
+
command = Racf::Commands::Listgrp.new(@session)
|
294
|
+
|
295
|
+
first_group = "@PL"
|
296
|
+
command.run(first_group)
|
297
|
+
|
298
|
+
other_groups = command.run(["CA7GROUP", "SYSTRT"])
|
299
|
+
other_groups.keys.should_not include(first_group)
|
300
|
+
end
|
301
|
+
end
|
302
|
+
end
|
303
|
+
end
|