gitsu 0.0.1
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 +21 -0
- data/Gemfile +4 -0
- data/LICENSE.txt +676 -0
- data/README.md +38 -0
- data/Rakefile +3 -0
- data/TODO +10 -0
- data/bin/git-su +13 -0
- data/bin/git-whoami +13 -0
- data/features/add_user.feature +26 -0
- data/features/change_user_in_different_scopes.feature +24 -0
- data/features/clear_user.feature +28 -0
- data/features/configure_default_scope.feature +9 -0
- data/features/edit_config.feature +8 -0
- data/features/list_users.feature +16 -0
- data/features/print_current_user.feature +60 -0
- data/features/print_options.feature +8 -0
- data/features/step_definitions/gitsu_steps.rb +193 -0
- data/features/support/env.rb +2 -0
- data/features/switch_to_fully_qualified_user.feature +10 -0
- data/features/switch_to_stored_user.feature +49 -0
- data/gitsu.gemspec +19 -0
- data/lib/gitsu.rb +9 -0
- data/lib/gitsu/factory.rb +23 -0
- data/lib/gitsu/git.rb +136 -0
- data/lib/gitsu/gitsu.rb +94 -0
- data/lib/gitsu/runner.rb +18 -0
- data/lib/gitsu/shell.rb +16 -0
- data/lib/gitsu/switcher.rb +94 -0
- data/lib/gitsu/user.rb +55 -0
- data/lib/gitsu/user_file.rb +32 -0
- data/lib/gitsu/user_list.rb +47 -0
- data/lib/gitsu/version.rb +3 -0
- data/man/git-su.1.ronn +120 -0
- data/spec/gitsu/git_spec.rb +189 -0
- data/spec/gitsu/gitsu_spec.rb +177 -0
- data/spec/gitsu/runner_spec.rb +27 -0
- data/spec/gitsu/switcher_spec.rb +196 -0
- data/spec/gitsu/user_list_spec.rb +82 -0
- data/spec/gitsu/user_spec.rb +33 -0
- data/spec/spec_helper.rb +1 -0
- metadata +106 -0
@@ -0,0 +1,177 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
module GitSu
|
4
|
+
describe Gitsu do
|
5
|
+
let(:output) { double('output') }
|
6
|
+
let(:switcher) { double('switcher') }
|
7
|
+
let(:gitsu) { GitSu::Gitsu.new(switcher, output) }
|
8
|
+
|
9
|
+
describe '#go' do
|
10
|
+
context 'when query string provided' do
|
11
|
+
context 'when no scope specified' do
|
12
|
+
it 'switches to the specified user in the default scope' do
|
13
|
+
switcher.should_receive(:request).with('Joe Bloggs', :default)
|
14
|
+
gitsu.go ['Joe', 'Bloggs']
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
context 'when local scope specified' do
|
19
|
+
context 'as short option (-l)' do
|
20
|
+
it 'switches to the specified user in the default scope' do
|
21
|
+
switcher.should_receive(:request).with('Joe Bloggs', :local)
|
22
|
+
gitsu.go ['Joe', 'Bloggs', "-l"]
|
23
|
+
end
|
24
|
+
end
|
25
|
+
context 'as long option (--local)' do
|
26
|
+
it 'switches to the specified user in the default scope' do
|
27
|
+
switcher.should_receive(:request).with('Joe Bloggs', :local)
|
28
|
+
gitsu.go ['Joe', 'Bloggs', "--local"]
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
context 'when global scope specified' do
|
34
|
+
context 'as short option (-g)' do
|
35
|
+
it 'switches to the specified user in the global scope' do
|
36
|
+
switcher.should_receive(:request).with('Joe Bloggs', :global)
|
37
|
+
gitsu.go ['Joe', 'Bloggs', "-g"]
|
38
|
+
end
|
39
|
+
end
|
40
|
+
context 'as long option (--global)' do
|
41
|
+
it 'switches to the specified user in the global scope' do
|
42
|
+
switcher.should_receive(:request).with('Joe Bloggs', :global)
|
43
|
+
gitsu.go ['Joe', 'Bloggs', "--global"]
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
context 'when system scope specified' do
|
49
|
+
context 'as short option (-s)' do
|
50
|
+
it 'switches to the specified user in the system scope' do
|
51
|
+
switcher.should_receive(:request).with('Joe Bloggs', :system)
|
52
|
+
gitsu.go ['Joe', 'Bloggs', "-s"]
|
53
|
+
end
|
54
|
+
end
|
55
|
+
context 'as long option (--system)' do
|
56
|
+
it 'switches to the specified user in the system scope' do
|
57
|
+
switcher.should_receive(:request).with('Joe Bloggs', :system)
|
58
|
+
gitsu.go ['Joe', 'Bloggs', "--system"]
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
context 'when multiple scopes specified' do
|
64
|
+
it 'switches to the specified user in the specified scopes' do
|
65
|
+
switcher.should_receive(:request).with('Joe Bloggs', :local)
|
66
|
+
switcher.should_receive(:request).with('Joe Bloggs', :global)
|
67
|
+
switcher.should_receive(:request).with('Joe Bloggs', :system)
|
68
|
+
gitsu.go ['Joe', 'Bloggs', "--local", "--global", "--system"]
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
context 'when no query provided' do
|
74
|
+
context 'when no scope specified' do
|
75
|
+
it 'prints all users' do
|
76
|
+
switcher.should_receive(:print_current).with(:all)
|
77
|
+
gitsu.go []
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
81
|
+
context 'when scope specified' do
|
82
|
+
it 'prints the current user in the specified scope' do
|
83
|
+
switcher.should_receive(:print_current).with(:system)
|
84
|
+
gitsu.go ["--system"]
|
85
|
+
end
|
86
|
+
end
|
87
|
+
|
88
|
+
context 'when multiple scopes specified' do
|
89
|
+
it 'prints the current user in the specified scopes' do
|
90
|
+
switcher.should_receive(:print_current).with(:local, :system)
|
91
|
+
gitsu.go ["--local", "--system"]
|
92
|
+
end
|
93
|
+
end
|
94
|
+
end
|
95
|
+
|
96
|
+
context 'when "clear" option passed' do
|
97
|
+
context "no scope is specified" do
|
98
|
+
context 'short option (-c)' do
|
99
|
+
it 'clears all Git users' do
|
100
|
+
switcher.should_receive(:clear).with(:all)
|
101
|
+
gitsu.go ["-c"]
|
102
|
+
end
|
103
|
+
end
|
104
|
+
|
105
|
+
context 'long option (--clear)' do
|
106
|
+
it 'clears all Git users' do
|
107
|
+
switcher.should_receive(:clear).with(:all)
|
108
|
+
gitsu.go ["--clear"]
|
109
|
+
end
|
110
|
+
end
|
111
|
+
end
|
112
|
+
|
113
|
+
context 'scope is specified' do
|
114
|
+
it 'clears the user in that scope' do
|
115
|
+
switcher.should_receive(:clear).with(:local)
|
116
|
+
gitsu.go ["--clear", "--local"]
|
117
|
+
end
|
118
|
+
end
|
119
|
+
|
120
|
+
context 'mulitple scopes are specified' do
|
121
|
+
it 'clears the user in those scopes' do
|
122
|
+
switcher.should_receive(:clear).with(:local, :system)
|
123
|
+
gitsu.go ["--clear", "--local", "--system"]
|
124
|
+
end
|
125
|
+
end
|
126
|
+
end
|
127
|
+
|
128
|
+
context 'when "add" option passed' do
|
129
|
+
context 'short option (-a)' do
|
130
|
+
it 'adds the specified user' do
|
131
|
+
switcher.should_receive(:add).with("John Galt <jgalt@example.com>")
|
132
|
+
gitsu.go ["-a", "John Galt <jgalt@example.com>"]
|
133
|
+
end
|
134
|
+
end
|
135
|
+
|
136
|
+
context 'long option (--add)' do
|
137
|
+
it 'adds the specified user' do
|
138
|
+
switcher.should_receive(:add).with("John Galt <jgalt@example.com>")
|
139
|
+
gitsu.go ["--add", "John Galt <jgalt@example.com>"]
|
140
|
+
end
|
141
|
+
end
|
142
|
+
end
|
143
|
+
|
144
|
+
context 'when "list" option passed' do
|
145
|
+
context 'short option (-t)' do
|
146
|
+
it 'lists the users' do
|
147
|
+
switcher.should_receive(:list)
|
148
|
+
gitsu.go ["-t"]
|
149
|
+
end
|
150
|
+
end
|
151
|
+
|
152
|
+
context 'long option (--list)' do
|
153
|
+
it 'lists the users' do
|
154
|
+
switcher.should_receive(:list)
|
155
|
+
gitsu.go ["--list"]
|
156
|
+
end
|
157
|
+
end
|
158
|
+
end
|
159
|
+
|
160
|
+
context 'when "edit" option passed' do
|
161
|
+
context 'short option (-e)' do
|
162
|
+
it 'edits the Gitsu config file' do
|
163
|
+
switcher.should_receive(:edit_config)
|
164
|
+
gitsu.go ["-e"]
|
165
|
+
end
|
166
|
+
end
|
167
|
+
|
168
|
+
context 'long option (--edit)' do
|
169
|
+
it 'edits the Gitsu config file' do
|
170
|
+
switcher.should_receive(:edit_config)
|
171
|
+
gitsu.go ["--edit"]
|
172
|
+
end
|
173
|
+
end
|
174
|
+
end
|
175
|
+
end
|
176
|
+
end
|
177
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
module GitSu
|
4
|
+
describe Runner do
|
5
|
+
let(:output) { double('output') }
|
6
|
+
let(:runner) { Runner.new(output) }
|
7
|
+
|
8
|
+
describe "#run" do
|
9
|
+
it "runs the block it's passed" do
|
10
|
+
ran = false
|
11
|
+
runner.run { ran = true }
|
12
|
+
ran.should be true
|
13
|
+
end
|
14
|
+
|
15
|
+
it "catches interruptions" do
|
16
|
+
output.should_receive(:puts).with "Interrupted"
|
17
|
+
runner.run { raise Interrupt }
|
18
|
+
end
|
19
|
+
|
20
|
+
it "prints errors" do
|
21
|
+
output.should_receive(:puts).with "Bad stuff happened"
|
22
|
+
runner.run { raise "Bad stuff happened" }
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
@@ -0,0 +1,196 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
module GitSu
|
4
|
+
|
5
|
+
describe Switcher do
|
6
|
+
let(:git) { double('git') }
|
7
|
+
let(:user_list) { double('user_list') }
|
8
|
+
let(:output) { double('output').as_null_object }
|
9
|
+
let(:switcher) { Switcher.new(git, user_list, output) }
|
10
|
+
let(:a_user) { User.new("Johnny Bravo", "jbravo@example.com") }
|
11
|
+
|
12
|
+
describe '#request' do
|
13
|
+
context "when request is a fully-qualified user string (e.g. 'John Galt <jgalt@example.com>'" do
|
14
|
+
it "switches to user" do
|
15
|
+
user = User.new('John Galt', 'jgalt@example.com')
|
16
|
+
git.should_receive(:select_user).with(user, :global)
|
17
|
+
git.should_receive(:render).with(user).and_return(user.to_s)
|
18
|
+
output.should_receive(:puts).with("Switched global user to John Galt <jgalt@example.com>")
|
19
|
+
switcher.request('John Galt <jgalt@example.com>', :global)
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
context "when no matching user found" do
|
24
|
+
it "does not switch user" do
|
25
|
+
user_list.should_receive(:find).with('asdfasdf').and_return User::NONE
|
26
|
+
output.should_receive(:puts).with("No user found matching 'asdfasdf'")
|
27
|
+
switcher.request('asdfasdf', :global)
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
context "when user is in user list" do
|
32
|
+
it "switches to requested user" do
|
33
|
+
user = User.new('John Galt', 'jgalt@example.com')
|
34
|
+
|
35
|
+
user_list.should_receive(:find).with("john").and_return user
|
36
|
+
git.should_receive(:select_user).with user, :global
|
37
|
+
git.should_receive(:render).with(user).and_return user.to_s
|
38
|
+
output.should_receive(:puts).with("Switched global user to John Galt <jgalt@example.com>")
|
39
|
+
switcher.request "john", :global
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
context "when 'default' scope is specified" do
|
44
|
+
it "switches user in configured default scope" do
|
45
|
+
user = User.new('John Galt', 'jgalt@example.com')
|
46
|
+
|
47
|
+
user_list.should_receive(:find).with("john").and_return user
|
48
|
+
git.should_receive(:default_select_scope).and_return(:global)
|
49
|
+
git.should_receive(:select_user).with user, :global
|
50
|
+
git.should_receive(:render).with(user).and_return user.to_s
|
51
|
+
output.should_receive(:puts).with("Switched global user to John Galt <jgalt@example.com>")
|
52
|
+
switcher.request "john", :default
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
describe '#print_current' do
|
58
|
+
context "when 'all' scope is specified" do
|
59
|
+
it "prints all users" do
|
60
|
+
local_user = User.new('Johnny Local', 'jlocal@example.com')
|
61
|
+
global_user = User.new('Johnny Global', 'jglobal@example.com')
|
62
|
+
system_user = User.new('Johnny System', 'jsystem@example.com')
|
63
|
+
derived_user = local_user
|
64
|
+
|
65
|
+
git.should_receive(:render_user).with(:derived).and_return derived_user.to_s
|
66
|
+
git.should_receive(:render_user).with(:local).and_return local_user.to_s
|
67
|
+
git.should_receive(:render_user).with(:global).and_return global_user.to_s
|
68
|
+
git.should_receive(:render_user).with(:system).and_return system_user.to_s
|
69
|
+
output.should_receive(:puts).with("Current user: Johnny Local <jlocal@example.com>")
|
70
|
+
output.should_receive(:puts).with("Local: Johnny Local <jlocal@example.com>")
|
71
|
+
output.should_receive(:puts).with("Global: Johnny Global <jglobal@example.com>")
|
72
|
+
output.should_receive(:puts).with("System: Johnny System <jsystem@example.com>")
|
73
|
+
switcher.print_current(:all)
|
74
|
+
end
|
75
|
+
end
|
76
|
+
|
77
|
+
context "when a scope is specified" do
|
78
|
+
context "when there is a user selected" do
|
79
|
+
it "prints the current user" do
|
80
|
+
current_user = User.new('John Galt', 'jgalt@example.com')
|
81
|
+
git.should_receive(:selected_user).with(:global).and_return current_user
|
82
|
+
git.should_receive(:render_user).with(:global).and_return current_user.to_s
|
83
|
+
output.should_receive(:puts).with("John Galt <jgalt@example.com>")
|
84
|
+
switcher.print_current(:global)
|
85
|
+
end
|
86
|
+
end
|
87
|
+
|
88
|
+
context "when there is no user selected" do
|
89
|
+
it 'does not print anything' do
|
90
|
+
git.should_receive(:selected_user).with(:local).and_return User::NONE
|
91
|
+
switcher.print_current(:local)
|
92
|
+
end
|
93
|
+
end
|
94
|
+
end
|
95
|
+
|
96
|
+
context "when multiple scopes are specified" do
|
97
|
+
context "when there is a user selected in all scopes" do
|
98
|
+
it "prints the current user in those scopes" do
|
99
|
+
local_user = User.new('John Local', 'jl@example.com')
|
100
|
+
global_user = User.new('John Global', 'jg@example.com')
|
101
|
+
git.should_receive(:selected_user).with(:local).and_return local_user
|
102
|
+
git.should_receive(:render_user).with(:local).and_return local_user.to_s
|
103
|
+
git.should_receive(:selected_user).with(:global).and_return global_user
|
104
|
+
git.should_receive(:render_user).with(:global).and_return global_user.to_s
|
105
|
+
output.should_receive(:puts).with("John Local <jl@example.com>")
|
106
|
+
output.should_receive(:puts).with("John Global <jg@example.com>")
|
107
|
+
switcher.print_current(:local, :global)
|
108
|
+
end
|
109
|
+
end
|
110
|
+
|
111
|
+
context "when there is no user selected in one scope" do
|
112
|
+
it 'prints only users for scopes that have users' do
|
113
|
+
global_user = User.new('John Global', 'jg@example.com')
|
114
|
+
git.should_receive(:selected_user).with(:local).and_return User::NONE
|
115
|
+
git.should_receive(:selected_user).with(:global).and_return global_user
|
116
|
+
git.should_receive(:render_user).with(:global).and_return global_user.to_s
|
117
|
+
output.should_receive(:puts).with("John Global <jg@example.com>")
|
118
|
+
switcher.print_current(:local, :global)
|
119
|
+
end
|
120
|
+
end
|
121
|
+
end
|
122
|
+
end
|
123
|
+
|
124
|
+
describe '#add' do
|
125
|
+
context "when the user doesn't already exist in the user list" do
|
126
|
+
it "adds the specified user to the user list" do
|
127
|
+
user_list.should_receive(:list).and_return []
|
128
|
+
user_list.should_receive(:add).with User.new('John Galt', 'jgalt@example.com')
|
129
|
+
output.should_receive(:puts).with("User 'John Galt <jgalt@example.com>' added to users")
|
130
|
+
switcher.add("John Galt <jgalt@example.com>")
|
131
|
+
end
|
132
|
+
end
|
133
|
+
context "when the user already exists in the user list" do
|
134
|
+
it "doesn't add the user to the user list" do
|
135
|
+
user_list.should_receive(:list).and_return [User.new('John Galt', 'jgalt@example.com')]
|
136
|
+
output.should_receive(:puts).with("User 'John Galt <jgalt@example.com>' already in user list")
|
137
|
+
switcher.add("John Galt <jgalt@example.com>")
|
138
|
+
end
|
139
|
+
end
|
140
|
+
context "when the input is not in expected format" do
|
141
|
+
it "prints an error" do
|
142
|
+
output.should_receive(:puts).with("Couldn't parse 'xxx' as user (expected user in format: 'John Smith <jsmith@example.com>')")
|
143
|
+
switcher.add("xxx")
|
144
|
+
end
|
145
|
+
end
|
146
|
+
end
|
147
|
+
|
148
|
+
describe '#list' do
|
149
|
+
it "lists the configured users" do
|
150
|
+
users = []
|
151
|
+
users << User.new("User One", "1@example.com")
|
152
|
+
users << User.new("User Two", "2@example.com")
|
153
|
+
|
154
|
+
user_list.should_receive(:list).and_return(users)
|
155
|
+
git.should_receive(:render).with(users.first).and_return(users.first.to_s)
|
156
|
+
output.should_receive(:puts).with("User One <1@example.com>")
|
157
|
+
git.should_receive(:render).with(users.last).and_return(users.last.to_s)
|
158
|
+
output.should_receive(:puts).with("User Two <2@example.com>")
|
159
|
+
switcher.list
|
160
|
+
end
|
161
|
+
end
|
162
|
+
|
163
|
+
describe '#clear' do
|
164
|
+
context "when a scope is specified" do
|
165
|
+
it "clears the current user in the specified scope" do
|
166
|
+
git.should_receive(:clear_user).with(:local)
|
167
|
+
switcher.clear :local
|
168
|
+
end
|
169
|
+
end
|
170
|
+
context "when multiple scopes are specified" do
|
171
|
+
it "clears Git users in the specified scopes" do
|
172
|
+
output.should_receive(:puts).with("Clearing Git users in local and global scopes")
|
173
|
+
git.should_receive(:clear_user).with(:local)
|
174
|
+
git.should_receive(:clear_user).with(:global)
|
175
|
+
switcher.clear :local,:global
|
176
|
+
end
|
177
|
+
end
|
178
|
+
context "when 'all' scope is specified" do
|
179
|
+
it "clears all Git users" do
|
180
|
+
output.should_receive(:puts).with("Clearing Git users in all scopes")
|
181
|
+
git.should_receive(:clear_user).with(:local)
|
182
|
+
git.should_receive(:clear_user).with(:global)
|
183
|
+
git.should_receive(:clear_user).with(:system)
|
184
|
+
switcher.clear :all
|
185
|
+
end
|
186
|
+
end
|
187
|
+
end
|
188
|
+
|
189
|
+
describe '#edit_config' do
|
190
|
+
it "tells Git to open the Gitsu config file in an editor" do
|
191
|
+
git.should_receive(:edit_gitsu_config)
|
192
|
+
switcher.edit_config
|
193
|
+
end
|
194
|
+
end
|
195
|
+
end
|
196
|
+
end
|
@@ -0,0 +1,82 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'yaml'
|
3
|
+
|
4
|
+
module GitSu
|
5
|
+
describe UserList do
|
6
|
+
|
7
|
+
let(:user_file) { "/tmp/#{rand}" }
|
8
|
+
let(:user_list) { UserList.new(user_file) }
|
9
|
+
after { File.delete user_file }
|
10
|
+
|
11
|
+
describe "#add" do
|
12
|
+
it "adds a user to the list" do
|
13
|
+
user_list.add User.new("John Galt", "jgalt@example.com")
|
14
|
+
|
15
|
+
user_map = YAML.parse_file(user_file).transform
|
16
|
+
user_map.keys.should include("jgalt@example.com")
|
17
|
+
user_map["jgalt@example.com"].should == "John Galt"
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
describe "#list" do
|
22
|
+
context "when there are no users configured" do
|
23
|
+
it "returns an empty array" do
|
24
|
+
user_list.list.should be_empty
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
context "when there are users configured" do
|
29
|
+
it "returns an array of all the users" do
|
30
|
+
user_list.add User.new("John Galt", "jgalt@example.com")
|
31
|
+
|
32
|
+
list = user_list.list
|
33
|
+
list.size.should be 1
|
34
|
+
list.should include User.new("John Galt", "jgalt@example.com")
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
describe "#find" do
|
40
|
+
context "when a matching user exists" do
|
41
|
+
it "returns the matching user by first name" do
|
42
|
+
user_list.add User.new("John Galt", "jgalt@example.com")
|
43
|
+
|
44
|
+
user_list.find("john").should == User.new("John Galt", "jgalt@example.com")
|
45
|
+
user_list.find("John").should == User.new("John Galt", "jgalt@example.com")
|
46
|
+
end
|
47
|
+
it "returns the matching user by email snippet" do
|
48
|
+
user_list.add User.new("John Galt", "jgalt@example.com")
|
49
|
+
|
50
|
+
user_list.find("example").should == User.new("John Galt", "jgalt@example.com")
|
51
|
+
end
|
52
|
+
it "returns the matching user by initials" do
|
53
|
+
user_list.add User.new("John Galt", "john.galt@example.com")
|
54
|
+
|
55
|
+
user_list.find("jg").should == User.new("John Galt", "john.galt@example.com")
|
56
|
+
user_list.find("JG").should == User.new("John Galt", "john.galt@example.com")
|
57
|
+
end
|
58
|
+
it "favours prefix over innards" do
|
59
|
+
user_list.add User.new("Matthew Jackson", "mj@example.com")
|
60
|
+
user_list.add User.new("Thomas Hickleton", "tom@example.com")
|
61
|
+
user_list.add User.new("John Smith", "js@example.com")
|
62
|
+
|
63
|
+
user_list.find("th").should eq User.new("Thomas Hickleton", "tom@example.com")
|
64
|
+
user_list.find("s").should eq User.new("John Smith", "js@example.com")
|
65
|
+
end
|
66
|
+
it "favours full firstname match over partial one" do
|
67
|
+
user_list.add User.new("Matthew Jackson", "mj@example.com")
|
68
|
+
user_list.add User.new("Mat Jackson", "zz@example.com")
|
69
|
+
|
70
|
+
user_list.find("mat").should eq User.new("Mat Jackson", "zz@example.com")
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
context "when no matching user exists" do
|
75
|
+
it "returns no user" do
|
76
|
+
user_list.find("john").should be User::NONE
|
77
|
+
end
|
78
|
+
end
|
79
|
+
end
|
80
|
+
end
|
81
|
+
end
|
82
|
+
|