osaka 0.2.3 → 0.3.0
Sign up to get free protection for your applications and to get access to all the features.
- data/lib/osaka/applicationwrapper.rb +64 -20
- data/lib/osaka/applicationwrapperexpectations.rb +4 -0
- data/lib/osaka/calculator.rb +5 -5
- data/lib/osaka/keynote.rb +9 -0
- data/lib/osaka/keynoteflow.rb +29 -0
- data/lib/osaka/location.rb +132 -0
- data/lib/osaka/mailmergeflow.rb +19 -0
- data/lib/osaka/pages.rb +10 -7
- data/lib/osaka/scriptrunner.rb +18 -3
- data/lib/osaka/textedit.rb +2 -2
- data/lib/osaka/typicalapplication.rb +80 -27
- data/lib/osaka/version.rb +1 -1
- data/lib/osaka.rb +3 -0
- data/spec/applicationwrapper_spec.rb +76 -39
- data/spec/assets/01_first_slides.key +0 -0
- data/spec/assets/02_second_slides.key +0 -0
- data/spec/assets/03_third_slides.key +0 -0
- data/spec/assets/mail_merge_data.numbers +0 -0
- data/spec/assets/mail_merge_template.pages +0 -0
- data/spec/calculator_spec.rb +6 -6
- data/spec/integration_calculator_spec.rb +0 -1
- data/spec/integration_keynote_spec.rb +29 -0
- data/spec/integration_pages_numbers_mail_merge_spec.rb +17 -0
- data/spec/integration_textedit_spec.rb +7 -3
- data/spec/keynote_flows_spec.rb +62 -0
- data/spec/keynote_spec.rb +21 -1
- data/spec/location_spec.rb +53 -0
- data/spec/mailmergeflow_spec.rb +40 -0
- data/spec/pages_spec.rb +13 -13
- data/spec/scriptrunner_spec.rb +9 -0
- data/spec/textedit_spec.rb +3 -3
- data/spec/typicalapplication_spec.rb +94 -29
- metadata +15 -2
@@ -7,6 +7,37 @@ describe "Osaka::ApplicationWrapper" do
|
|
7
7
|
quoted_name = "\"#{name}\""
|
8
8
|
subject { Osaka::ApplicationWrapper.new(name) }
|
9
9
|
|
10
|
+
before (:each) do
|
11
|
+
Osaka::ScriptRunner.enable_debug_prints
|
12
|
+
end
|
13
|
+
|
14
|
+
after (:each) do
|
15
|
+
Osaka::ScriptRunner.disable_debug_prints
|
16
|
+
end
|
17
|
+
|
18
|
+
it "Should be able to clone wrappers" do
|
19
|
+
subject.set_current_window "Window"
|
20
|
+
new_wrapper = subject.clone
|
21
|
+
new_wrapper.should == subject
|
22
|
+
new_wrapper.should_not.equal?(subject)
|
23
|
+
end
|
24
|
+
|
25
|
+
it "Should be able to compare objects using names" do
|
26
|
+
subject.should == Osaka::ApplicationWrapper.new(name)
|
27
|
+
subject.should_not == Osaka::ApplicationWrapper.new("otherName")
|
28
|
+
end
|
29
|
+
|
30
|
+
it "Should be able to compare objects using window" do
|
31
|
+
equal_object = Osaka::ApplicationWrapper.new(name)
|
32
|
+
unequal_object = Osaka::ApplicationWrapper.new(name)
|
33
|
+
equal_object.set_current_window("Window")
|
34
|
+
subject.set_current_window("Window")
|
35
|
+
unequal_object.set_current_window "Another Window"
|
36
|
+
|
37
|
+
subject.should == equal_object
|
38
|
+
subject.should_not == unequal_object
|
39
|
+
end
|
40
|
+
|
10
41
|
def check_for_warning(action)
|
11
42
|
Osaka::ScriptRunner.should_receive(:execute).and_return("Blah")
|
12
43
|
subject.should_receive(:print_warning).with(action, "Blah")
|
@@ -42,6 +73,11 @@ describe "Osaka::ApplicationWrapper" do
|
|
42
73
|
subject.system_event!("quit")
|
43
74
|
end
|
44
75
|
|
76
|
+
it "Should be possible to check whether an application is still running" do
|
77
|
+
Osaka::ScriptRunner.should_receive(:execute).with("tell application \"System Events\"; (name of processes) contains \"#{name}\"; end tell").and_return("false")
|
78
|
+
subject.running?.should == false
|
79
|
+
end
|
80
|
+
|
45
81
|
it "Should be able to generate events via the Systems Events and activate the application first" do
|
46
82
|
subject.should_receive(:activate)
|
47
83
|
subject.should_receive(:system_event!).with("quit")
|
@@ -50,7 +86,7 @@ describe "Osaka::ApplicationWrapper" do
|
|
50
86
|
|
51
87
|
it "Should be able to check whether a specific element exists" do
|
52
88
|
Osaka::ScriptRunner.should_receive(:execute).with(/exists window 1/).and_return("true\n")
|
53
|
-
subject.check.exists(
|
89
|
+
subject.check.exists(at.window(1)).should == true
|
54
90
|
end
|
55
91
|
|
56
92
|
it "Should be able to wait for for a specific element existing" do
|
@@ -59,18 +95,18 @@ describe "Osaka::ApplicationWrapper" do
|
|
59
95
|
counter = counter + 1
|
60
96
|
(counter == 5).to_s
|
61
97
|
}
|
62
|
-
subject.wait_until!.exists(
|
98
|
+
subject.wait_until!.exists(at.window(1))
|
63
99
|
end
|
64
100
|
|
65
101
|
it "Should be able to wait until exists and activate the application first" do
|
66
102
|
subject.should_receive(:activate)
|
67
103
|
Osaka::ScriptRunner.should_receive(:execute).with(/exists window 1/).and_return("true")
|
68
|
-
subject.wait_until.exists(
|
104
|
+
subject.wait_until.exists(at.window(1))
|
69
105
|
end
|
70
106
|
|
71
107
|
it "Should be able to wait for a specific element to not exist anymore" do
|
72
108
|
Osaka::ScriptRunner.should_receive(:execute).with(/not exists window 1/).and_return("true")
|
73
|
-
subject.wait_until!.not_exists(
|
109
|
+
subject.wait_until!.not_exists(at.window(1))
|
74
110
|
end
|
75
111
|
|
76
112
|
it "Should be able to generate keystroke events" do
|
@@ -103,7 +139,7 @@ describe "Osaka::ApplicationWrapper" do
|
|
103
139
|
it "Should be able to do a keystroke and wait until something happen in one easy line" do
|
104
140
|
Osaka::ScriptRunner.should_receive(:execute).with(/keystroke "p"/).and_return("")
|
105
141
|
Osaka::ScriptRunner.should_receive(:execute).with(/exists window 1/).and_return("true")
|
106
|
-
subject.keystroke!("p", []).wait_until!.exists(
|
142
|
+
subject.keystroke!("p", []).wait_until!.exists(at.window(1))
|
107
143
|
end
|
108
144
|
|
109
145
|
it "Should be able to keystroke_and_wait_until_exists and activate" do
|
@@ -111,12 +147,12 @@ describe "Osaka::ApplicationWrapper" do
|
|
111
147
|
subject.should_receive(:focus)
|
112
148
|
Osaka::ScriptRunner.should_receive(:execute).with(/keystroke "p"/).and_return("")
|
113
149
|
Osaka::ScriptRunner.should_receive(:execute).with(/exists window 1/).and_return("true")
|
114
|
-
subject.keystroke("p", []).wait_until!.exists(
|
150
|
+
subject.keystroke("p", []).wait_until!.exists(at.window(1))
|
115
151
|
end
|
116
152
|
|
117
153
|
it "Should be able to do clicks" do
|
118
154
|
Osaka::ScriptRunner.should_receive(:execute).with(/click menu button "PDF"/).and_return("")
|
119
|
-
subject.click!(
|
155
|
+
subject.click!(at.menu_button("PDF"))
|
120
156
|
end
|
121
157
|
|
122
158
|
it "Should be able to do click and activate" do
|
@@ -124,55 +160,56 @@ describe "Osaka::ApplicationWrapper" do
|
|
124
160
|
subject.should_receive(:click!).with("button")
|
125
161
|
subject.click("button")
|
126
162
|
end
|
127
|
-
|
163
|
+
|
128
164
|
it "Should be able to do clicks and wait until something happened in one easy line" do
|
129
165
|
Osaka::ScriptRunner.should_receive(:execute).with(/click/).and_return("")
|
130
|
-
Osaka::ScriptRunner.should_receive(:execute).with(/exists window/).and_return("true")
|
131
|
-
subject.click!("button").wait_until!.exists(
|
166
|
+
Osaka::ScriptRunner.should_receive(:execute).with(/exists window 1/).and_return("true")
|
167
|
+
subject.click!("button").wait_until!.exists(at.window(1))
|
132
168
|
end
|
133
169
|
|
134
170
|
it "Should be able to click_and_wait_until_exists and activate" do
|
135
171
|
subject.should_receive(:activate)
|
136
172
|
Osaka::ScriptRunner.should_receive(:execute).with(/click/).and_return("")
|
137
|
-
Osaka::ScriptRunner.should_receive(:execute).with(/exists window/).and_return("true")
|
138
|
-
subject.click("button").wait_until!.exists(
|
173
|
+
Osaka::ScriptRunner.should_receive(:execute).with(/exists window 1/).and_return("true")
|
174
|
+
subject.click("button").wait_until!.exists(at.window(1))
|
175
|
+
end
|
176
|
+
|
177
|
+
it "Should be able to click on menu bar items" do
|
178
|
+
subject.should_receive("activate")
|
179
|
+
subject.should_receive("click!").with(at.menu_item("Hey").menu(1).menu_bar_item("File").menu_bar(1))
|
180
|
+
subject.click_menu_bar(at.menu_item("Hey"), "File")
|
139
181
|
end
|
140
182
|
|
141
183
|
it "Should be able to set a value to an element" do
|
142
|
-
subject.should_receive(:system_event!).with(/set value of window to "newvalue"/).and_return("")
|
143
|
-
subject.set!("value",
|
184
|
+
subject.should_receive(:system_event!).with(/set value of window 1 to "newvalue"/).and_return("")
|
185
|
+
subject.set!("value", at.window(1), "newvalue")
|
144
186
|
end
|
145
187
|
|
146
188
|
it "Prints a warning when setting and element and output is received" do
|
147
189
|
check_for_warning("set")
|
148
|
-
subject.set!("value",
|
190
|
+
subject.set!("value", at.window(1), "newvalue")
|
149
191
|
end
|
150
192
|
|
151
193
|
it "Should be able to set to boolean values" do
|
152
|
-
subject.should_receive(:system_event!).with(/set value of window to true/).and_return("")
|
153
|
-
subject.set!("value",
|
194
|
+
subject.should_receive(:system_event!).with(/set value of window 1 to true/).and_return("")
|
195
|
+
subject.set!("value", at.window(1), true)
|
154
196
|
end
|
155
197
|
|
156
198
|
it "Should be able to get a value from an element" do
|
157
|
-
subject.should_receive(:system_event!).with(/get value of window/).and_return("1\n")
|
158
|
-
subject.get!("value",
|
199
|
+
subject.should_receive(:system_event!).with(/get value of window 1/).and_return("1\n")
|
200
|
+
subject.get!("value", at.window(1)).should == "1"
|
159
201
|
end
|
160
202
|
|
161
203
|
it "Should use the locally stored window when that one is set." do
|
162
|
-
subject.
|
204
|
+
subject.set_current_window("1")
|
163
205
|
subject.should_receive(:system_event!).with(/get value of window \"1\"/).and_return("1\n")
|
164
206
|
subject.get!("value").should == "1"
|
165
207
|
end
|
166
|
-
|
167
|
-
it "Should throw an exception when window is set multiple times." do
|
168
|
-
subject.window = "Untitled"
|
169
|
-
lambda {subject.get!("value", "window 1")}.should raise_error(Osaka::InvalidLocation, "Invalid location for command: of window 1 of window \"Untitled\"")
|
170
|
-
end
|
171
|
-
|
208
|
+
|
172
209
|
it "Should combine the location and the window" do
|
173
|
-
subject.
|
210
|
+
subject.set_current_window("1")
|
174
211
|
subject.should_receive(:system_event!).with(/get value of dialog 2 of window "1"/).and_return("1\n")
|
175
|
-
subject.get!("value",
|
212
|
+
subject.get!("value", at.dialog(2)).should == "1"
|
176
213
|
end
|
177
214
|
|
178
215
|
it "Should be able to get values from the application itself" do
|
@@ -182,13 +219,13 @@ describe "Osaka::ApplicationWrapper" do
|
|
182
219
|
|
183
220
|
it "Should be able to set a value and activate" do
|
184
221
|
subject.should_receive(:activate)
|
185
|
-
subject.should_receive(:set!).with("value",
|
186
|
-
subject.set("value",
|
222
|
+
subject.should_receive(:set!).with("value", at.window(1), "newvalue")
|
223
|
+
subject.set("value", at.window(1), "newvalue")
|
187
224
|
end
|
188
225
|
|
189
226
|
it "Should be able to loop over some script until something happens" do
|
190
227
|
counter = 0
|
191
|
-
Osaka::ScriptRunner.should_receive(:execute).exactly(3).times.with(/exists window/).and_return {
|
228
|
+
Osaka::ScriptRunner.should_receive(:execute).exactly(3).times.with(/exists window 1/).and_return {
|
192
229
|
counter = counter + 1
|
193
230
|
if counter > 2
|
194
231
|
"true"
|
@@ -197,7 +234,7 @@ describe "Osaka::ApplicationWrapper" do
|
|
197
234
|
end
|
198
235
|
}
|
199
236
|
subject.should_receive(:activate).twice
|
200
|
-
subject.until!.exists(
|
237
|
+
subject.until!.exists(at.window(1)) {
|
201
238
|
subject.activate
|
202
239
|
}
|
203
240
|
end
|
@@ -218,9 +255,9 @@ describe "Osaka::ApplicationWrapper" do
|
|
218
255
|
end
|
219
256
|
|
220
257
|
it "Should initialize the current window when it is not focused yet" do
|
221
|
-
subject.should_receive(:window_list).and_return(["1"])
|
258
|
+
subject.should_receive(:window_list).and_return(["1"])
|
222
259
|
subject.focus
|
223
|
-
subject.
|
260
|
+
subject.current_window_name.should == "1"
|
224
261
|
end
|
225
262
|
|
226
263
|
it "Shouldn't initialize current window when it is already set" do
|
@@ -230,7 +267,7 @@ describe "Osaka::ApplicationWrapper" do
|
|
230
267
|
subject.should_receive(:window_list).and_return(["2", "1"])
|
231
268
|
subject.should_receive(:set!)
|
232
269
|
subject.focus
|
233
|
-
subject.
|
270
|
+
subject.current_window_name.should == "1"
|
234
271
|
end
|
235
272
|
|
236
273
|
it "Should re-initialize the current window when it doesn't exist anymore" do
|
@@ -239,7 +276,7 @@ describe "Osaka::ApplicationWrapper" do
|
|
239
276
|
|
240
277
|
subject.should_receive(:window_list).and_return(["2"])
|
241
278
|
subject.focus
|
242
|
-
subject.
|
279
|
+
subject.current_window_name.should == "2"
|
243
280
|
end
|
244
281
|
|
245
282
|
it "Should focus the current window when it doesn't have focus" do
|
@@ -247,8 +284,8 @@ describe "Osaka::ApplicationWrapper" do
|
|
247
284
|
subject.focus
|
248
285
|
|
249
286
|
subject.should_receive(:window_list).and_return(["2", "1"])
|
250
|
-
subject.should_receive(:set!).with("value", "attribute \"AXMain\"
|
287
|
+
subject.should_receive(:set!).with("value", "attribute \"AXMain\"", true )
|
251
288
|
subject.focus
|
252
|
-
end
|
253
|
-
|
289
|
+
end
|
290
|
+
|
254
291
|
end
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
data/spec/calculator_spec.rb
CHANGED
@@ -16,16 +16,15 @@ describe "Mac GUI Calculator" do
|
|
16
16
|
# TODO: Fix this duplication between this and TextEdit.
|
17
17
|
|
18
18
|
@wrapper.should_receive(:activate)
|
19
|
-
@wrapper.should_receive(:
|
19
|
+
@wrapper.should_receive(:current_window_name).and_return("")
|
20
20
|
subject.should_receive(:wait_for_new_window).with([])
|
21
21
|
@wrapper.should_receive(:window_list).and_return(["Calculator"])
|
22
|
-
@wrapper.should_receive(:
|
22
|
+
@wrapper.should_receive(:set_current_window).with("Calculator")
|
23
23
|
subject.activate
|
24
24
|
end
|
25
|
-
|
26
|
-
|
25
|
+
|
27
26
|
it "Should be able to click a button on the calculator" do
|
28
|
-
expect_click!(
|
27
|
+
expect_click!(at.button("1").group(2))
|
29
28
|
subject.click("1")
|
30
29
|
end
|
31
30
|
|
@@ -35,12 +34,13 @@ describe "Mac GUI Calculator" do
|
|
35
34
|
end
|
36
35
|
|
37
36
|
it "Should be able to quit the calculator" do
|
37
|
+
@wrapper.should_receive(:running?).and_return(true)
|
38
38
|
@wrapper.should_receive(:quit)
|
39
39
|
subject.quit
|
40
40
|
end
|
41
41
|
|
42
42
|
it "Should be able to get the value from the screen" do
|
43
|
-
@wrapper.should_receive(:get!).with("value",
|
43
|
+
@wrapper.should_receive(:get!).with("value", at.static_text(1).group(1)).and_return("0")
|
44
44
|
subject.result.should == "0"
|
45
45
|
end
|
46
46
|
|
@@ -0,0 +1,29 @@
|
|
1
|
+
require 'tmpdir'
|
2
|
+
require 'osaka'
|
3
|
+
|
4
|
+
describe "Integration tests for Keynote and Common Flows" do
|
5
|
+
|
6
|
+
it "Should be able to do a combine with just one file" do
|
7
|
+
|
8
|
+
assets_directory = File.join(File.dirname(__FILE__), "assets")
|
9
|
+
|
10
|
+
keynote_file = File.join(assets_directory, "01_first_slides.key")
|
11
|
+
Dir.mktmpdir { |dir|
|
12
|
+
results_file = File.join(dir, "results.key")
|
13
|
+
CommonFlows.keynote_combine_files(results_file, keynote_file)
|
14
|
+
File.exists?(results_file).should == true
|
15
|
+
}
|
16
|
+
end
|
17
|
+
|
18
|
+
it "Should be able to combine multiple files" do
|
19
|
+
assets_directory = File.join(File.dirname(__FILE__), "assets")
|
20
|
+
|
21
|
+
Dir.mktmpdir { |dir|
|
22
|
+
results_file = File.join(dir, "results.key")
|
23
|
+
CommonFlows.keynote_combine_files_from_directory_sorted(results_file, assets_directory)
|
24
|
+
File.exists?(results_file).should == true
|
25
|
+
}
|
26
|
+
|
27
|
+
end
|
28
|
+
|
29
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
require 'tmpdir'
|
2
|
+
require 'osaka'
|
3
|
+
|
4
|
+
describe "Integration of mail merge flow with Pages and Numbers" do
|
5
|
+
|
6
|
+
it "Should mail merge the assets and generate a PDF" do
|
7
|
+
|
8
|
+
assets_directory = File.join(File.dirname(__FILE__), "assets")
|
9
|
+
numbers_data = File.join(assets_directory, "mail_merge_data.numbers")
|
10
|
+
pages_template = File.join(assets_directory, "mail_merge_template.pages")
|
11
|
+
Dir.mktmpdir { |dir|
|
12
|
+
pdf_output_file = File.join(dir, "output.pdf")
|
13
|
+
CommonFlows::number_and_pages_mail_merge(numbers_data, pages_template, pdf_output_file)
|
14
|
+
File.exists?(pdf_output_file).should == true
|
15
|
+
}
|
16
|
+
end
|
17
|
+
end
|
@@ -6,28 +6,32 @@ describe "Integration test using TextEdit" do
|
|
6
6
|
subject { Osaka::TextEdit.new }
|
7
7
|
|
8
8
|
before (:each) do
|
9
|
+
if subject.running?
|
10
|
+
subject.quit(:dont_save)
|
11
|
+
end
|
9
12
|
end
|
10
13
|
|
11
14
|
after (:each) do
|
12
15
|
subject.quit(:dont_save)
|
13
16
|
end
|
14
17
|
|
15
|
-
it "can type in the window" do
|
18
|
+
it "can type in the window" do
|
16
19
|
subject.activate
|
17
20
|
subject.type("Hello World")
|
18
21
|
subject.text.should == "Hello World"
|
19
22
|
end
|
20
23
|
|
21
24
|
it "can type in two windows using two instances" do
|
25
|
+
|
22
26
|
editor1 = subject
|
23
27
|
editor2 = Osaka::TextEdit.new
|
24
|
-
|
28
|
+
|
25
29
|
editor1.activate
|
26
30
|
editor2.new_document
|
27
31
|
|
28
32
|
editor1.type("Typing in window 1")
|
29
33
|
editor2.type("Typing in window 2")
|
30
|
-
|
34
|
+
|
31
35
|
editor1.text.should == "Typing in window 1"
|
32
36
|
editor2.text.should == "Typing in window 2"
|
33
37
|
|
@@ -0,0 +1,62 @@
|
|
1
|
+
|
2
|
+
require "osaka"
|
3
|
+
|
4
|
+
describe "Common flows in keynote" do
|
5
|
+
|
6
|
+
before(:each) do
|
7
|
+
@mock_keynote = double(:Keynote)
|
8
|
+
end
|
9
|
+
|
10
|
+
it "Should be able to combine just one single file" do
|
11
|
+
Osaka::Keynote.should_receive(:new).and_return(@mock_keynote)
|
12
|
+
@mock_keynote.should_receive(:open).with("one_file.key")
|
13
|
+
@mock_keynote.should_receive(:save_as).with("result.key")
|
14
|
+
@mock_keynote.should_receive(:save)
|
15
|
+
@mock_keynote.should_receive(:quit)
|
16
|
+
CommonFlows.keynote_combine_files("result.key", "one_file.key")
|
17
|
+
end
|
18
|
+
|
19
|
+
it "Should be able to combine multiple files in one result" do
|
20
|
+
mock2_keynote = double(:Keynote)
|
21
|
+
mock3_keynote = double(:Keynote)
|
22
|
+
Osaka::Keynote.should_receive(:new).and_return(@mock_keynote, mock2_keynote, mock3_keynote)
|
23
|
+
@mock_keynote.should_receive(:open).with("one_file.key")
|
24
|
+
@mock_keynote.should_receive(:save_as).with("result.key")
|
25
|
+
@mock_keynote.should_receive(:select_all_slides).exactly(2).times
|
26
|
+
@mock_keynote.should_receive(:paste).exactly(2).times
|
27
|
+
@mock_keynote.should_receive(:save)
|
28
|
+
|
29
|
+
|
30
|
+
mock2_keynote.should_receive(:open).with("two_file.key")
|
31
|
+
mock2_keynote.should_receive(:select_all_slides)
|
32
|
+
mock2_keynote.should_receive(:copy)
|
33
|
+
mock2_keynote.should_receive(:close)
|
34
|
+
|
35
|
+
mock3_keynote.should_receive(:open).with("three_file.key")
|
36
|
+
mock3_keynote.should_receive(:select_all_slides)
|
37
|
+
mock3_keynote.should_receive(:copy)
|
38
|
+
mock3_keynote.should_receive(:close)
|
39
|
+
|
40
|
+
@mock_keynote.should_receive(:quit)
|
41
|
+
CommonFlows.keynote_combine_files("result.key", ["one_file.key", "two_file.key", "three_file.key"])
|
42
|
+
end
|
43
|
+
|
44
|
+
it "Should be able to combine multiple files from one directory sorted" do
|
45
|
+
files_in_dir = [".", "..", "one.key", "05_file.key", "02key.wrong", "another", "01hey.key", "last"]
|
46
|
+
files_matching = ["./05_file.key", "./01hey.key", "./one.key"]
|
47
|
+
Dir.should_receive(:new).with(".").and_return(files_in_dir)
|
48
|
+
CommonFlows.should_receive(:keynote_combine_files).with("results.key", files_matching.sort)
|
49
|
+
CommonFlows.keynote_combine_files_from_directory_sorted("results.key")
|
50
|
+
end
|
51
|
+
|
52
|
+
it "Should be able to combine multiple files from one directory sorted with pattern" do
|
53
|
+
files_in_dir = [".", "..", "05_file.key", "02key.wrong", "another", "01hey.key", "last"]
|
54
|
+
files_in_dir_to_be_used = ["dirname/01hey.key", "dirname/05_file.key"]
|
55
|
+
mocked_dir = double(:Dir)
|
56
|
+
Dir.should_receive(:new).with("dirname").and_return(mocked_dir)
|
57
|
+
mocked_dir.should_receive(:entries).and_return(files_in_dir)
|
58
|
+
CommonFlows.should_receive(:keynote_combine_files).with("results.key", files_in_dir_to_be_used)
|
59
|
+
CommonFlows.keynote_combine_files_from_directory_sorted("results.key", "dirname", /^\d+.*\.key$/)
|
60
|
+
end
|
61
|
+
|
62
|
+
end
|
data/spec/keynote_spec.rb
CHANGED
@@ -3,14 +3,34 @@ require 'osaka'
|
|
3
3
|
|
4
4
|
describe "Osaka::Keynote" do
|
5
5
|
|
6
|
+
include(*Osaka::ApplicationWrapperExpectations)
|
7
|
+
|
6
8
|
subject { Osaka::Keynote.new }
|
7
9
|
|
8
10
|
before (:each) do
|
9
|
-
subject.wrapper = double("Osaka::ApplicationWrapper").as_null_object
|
11
|
+
@wrapper = subject.wrapper = double("Osaka::ApplicationWrapper").as_null_object
|
10
12
|
end
|
11
13
|
|
12
14
|
it "Should create the correct keynote print dialog" do
|
13
15
|
subject.create_print_dialog("window").class.should == Osaka::KeynotePrintDialog
|
14
16
|
end
|
15
17
|
|
18
|
+
it "Should be possible to select all the slides in the default location" do
|
19
|
+
slides_button_location = at.button("Slides").group(1).outline(1).scroll_area(2).splitter_group(1).splitter_group(1)
|
20
|
+
should_check!(:exists, slides_button_location, true)
|
21
|
+
expect_click(slides_button_location)
|
22
|
+
subject.should_receive(:select_all)
|
23
|
+
subject.select_all_slides
|
24
|
+
end
|
25
|
+
|
26
|
+
it "Should be possible to select all the slides in the alternative location" do
|
27
|
+
slides_button_location = at.button("Slides").group(1).outline(1).scroll_area(2).splitter_group(1).splitter_group(1)
|
28
|
+
alternative_slides_button_location = at.button("Slides").group(1).outline(1).scroll_area(1).splitter_group(1).splitter_group(1)
|
29
|
+
should_check!(:exists, slides_button_location, false)
|
30
|
+
expect_click(alternative_slides_button_location)
|
31
|
+
subject.should_receive(:select_all)
|
32
|
+
subject.select_all_slides
|
33
|
+
end
|
34
|
+
|
35
|
+
|
16
36
|
end
|
@@ -0,0 +1,53 @@
|
|
1
|
+
|
2
|
+
require 'osaka'
|
3
|
+
|
4
|
+
describe "Location path for an applescript command" do
|
5
|
+
|
6
|
+
it "Should be able to create a valid location when appending two locations" do
|
7
|
+
location = Osaka::Location.new("scrollbar") + Osaka::Location.new("window 1")
|
8
|
+
location.to_s.should == "scrollbar of window 1"
|
9
|
+
end
|
10
|
+
|
11
|
+
it "Should be able to add empty locations" do
|
12
|
+
location = Osaka::Location.new("location") + ""
|
13
|
+
location.to_s.should == "location"
|
14
|
+
end
|
15
|
+
|
16
|
+
it "Should be able to create locations using at" do
|
17
|
+
at.button(1).to_s.should == "button 1"
|
18
|
+
end
|
19
|
+
|
20
|
+
it "Should be able to create empty prefixed locations" do
|
21
|
+
Osaka::Location.new("").as_prefixed_location.should == ""
|
22
|
+
end
|
23
|
+
|
24
|
+
it "Should be able to check whether the location already has a window" do
|
25
|
+
Osaka::Location.new("").has_window?.should == false
|
26
|
+
at.window("one").has_window?.should == true
|
27
|
+
end
|
28
|
+
|
29
|
+
it "Should be able to create groups" do
|
30
|
+
at.group(1).to_s.should == "group 1"
|
31
|
+
end
|
32
|
+
|
33
|
+
it "Should be able to combine buttons with groups" do
|
34
|
+
at.button("1").group(2).to_s.should == 'button "1" of group 2'
|
35
|
+
end
|
36
|
+
|
37
|
+
it "Should be able to combine groups with windows" do
|
38
|
+
at.button(1).group(2).window("Name").to_s.should == 'button 1 of group 2 of window "Name"'
|
39
|
+
end
|
40
|
+
|
41
|
+
it "Can compare different locations" do
|
42
|
+
at.button(1).should == at.button(1)
|
43
|
+
end
|
44
|
+
|
45
|
+
it "Should be able to convert to a prefixed location" do
|
46
|
+
at.button(1).as_prefixed_location == " of button 1"
|
47
|
+
end
|
48
|
+
|
49
|
+
it "Cannot create a location with two times window" do
|
50
|
+
lambda {at.window(1).window(1)}.should raise_error(Osaka::InvalidLocation, "Invalid location: window 1 of window 1")
|
51
|
+
end
|
52
|
+
|
53
|
+
end
|
@@ -0,0 +1,40 @@
|
|
1
|
+
|
2
|
+
require "osaka"
|
3
|
+
|
4
|
+
describe "Mail Merge to PDF common flow" do
|
5
|
+
|
6
|
+
before(:each) do
|
7
|
+
@mock_numbers = double(:Numbers)
|
8
|
+
@mock_pages = double(:Pages)
|
9
|
+
end
|
10
|
+
|
11
|
+
it "Should do a good mail merge with Pages and Keynote flow" do
|
12
|
+
Osaka::Numbers.should_receive(:new).and_return(@mock_numbers)
|
13
|
+
Osaka::Pages.should_receive(:new).and_return(@mock_pages)
|
14
|
+
|
15
|
+
@mock_numbers.should_receive(:open).with("/template/numbers")
|
16
|
+
@mock_numbers.should_receive(:save)
|
17
|
+
|
18
|
+
@mock_pages.should_receive(:open).with("/template/pages")
|
19
|
+
@mock_pages.should_receive(:mail_merge_to_pdf).with("/output/file.pdf")
|
20
|
+
|
21
|
+
@mock_numbers.should_receive(:quit).with(:dont_save)
|
22
|
+
@mock_pages.should_receive(:quit).with(:dont_save)
|
23
|
+
|
24
|
+
CommonFlows.number_and_pages_mail_merge("/template/numbers", "/template/pages", "/output/file.pdf") {}
|
25
|
+
end
|
26
|
+
|
27
|
+
it "Should yield for filling in the numbers fields" do
|
28
|
+
@mock_numbers.as_null_object
|
29
|
+
@mock_pages.as_null_object
|
30
|
+
Osaka::Numbers.should_receive(:new).and_return(@mock_numbers)
|
31
|
+
Osaka::Pages.should_receive(:new).and_return(@mock_pages)
|
32
|
+
|
33
|
+
retrieved_numbers = nil
|
34
|
+
CommonFlows.number_and_pages_mail_merge("1", "2", "3") { |numbers|
|
35
|
+
retrieved_numbers = numbers
|
36
|
+
}
|
37
|
+
retrieved_numbers.should == @mock_numbers
|
38
|
+
end
|
39
|
+
|
40
|
+
end
|
data/spec/pages_spec.rb
CHANGED
@@ -25,18 +25,18 @@ describe "Osaka::Pages" do
|
|
25
25
|
end
|
26
26
|
|
27
27
|
it "Should be able to select the Mail Merge" do
|
28
|
-
|
29
|
-
|
28
|
+
@wrapper.should_receive(:current_window_name).any_number_of_times.and_return("Pages.pages")
|
29
|
+
expect_click_menu_bar(at.menu_item(20), "Edit")
|
30
|
+
should_wait_until(:exists, at.button("Merge").sheet(1))
|
30
31
|
subject.mail_merge
|
31
32
|
end
|
32
33
|
|
33
34
|
it "Should click the merge button of the mail merge dialog" do
|
34
|
-
|
35
|
-
|
35
|
+
@wrapper.should_receive(:current_window_name).any_number_of_times.and_return("Pages.pages")
|
36
|
+
expect_click!(at.button("Merge").sheet(1))
|
37
|
+
should_wait_until!(:exists, at.menu_button("PDF").window("Print"))
|
36
38
|
subject.mail_merge.merge
|
37
39
|
end
|
38
|
-
|
39
|
-
|
40
40
|
end
|
41
41
|
|
42
42
|
describe "Osaka::Pages Mail Merge dialog" do
|
@@ -47,20 +47,20 @@ describe "Osaka::Pages Mail Merge dialog" do
|
|
47
47
|
|
48
48
|
before (:each) do
|
49
49
|
@wrapper = subject.wrapper = double("Osaka::ApplicationWrapper").as_null_object
|
50
|
-
@location = subject.location = "window
|
50
|
+
@location = subject.location = "window \"Pages.pages\""
|
51
51
|
end
|
52
52
|
|
53
53
|
it "Should be able to set the mail merge dialog to merge to new document" do
|
54
|
-
expect_click(
|
55
|
-
should_wait_until!(:exists,
|
56
|
-
expect_click!(
|
54
|
+
expect_click(at.pop_up_button(2).sheet(1))
|
55
|
+
should_wait_until!(:exists, at.menu_item(1).menu(1).pop_up_button(2).sheet(1))
|
56
|
+
expect_click!(at.menu_item(1).menu(1).pop_up_button(2).sheet(1))
|
57
57
|
subject.set_merge_to_new_document
|
58
58
|
end
|
59
59
|
|
60
60
|
it "Should be able to set the mail merge dialog to merge to printer" do
|
61
|
-
expect_click(
|
62
|
-
should_wait_until!(:exists,
|
63
|
-
expect_click!(
|
61
|
+
expect_click(at.pop_up_button(2).sheet(1))
|
62
|
+
should_wait_until!(:exists, at.menu_item(2).menu(1).pop_up_button(2).sheet(1))
|
63
|
+
expect_click!(at.menu_item(2).menu(1).pop_up_button(2).sheet(1))
|
64
64
|
subject.set_merge_to_printer
|
65
65
|
end
|
66
66
|
end
|
data/spec/scriptrunner_spec.rb
CHANGED
@@ -22,6 +22,15 @@ describe "Osaka::ScriptRunner" do
|
|
22
22
|
subject.execute("random number")
|
23
23
|
Osaka::ScriptRunner::disable_debug_prints
|
24
24
|
end
|
25
|
+
|
26
|
+
it "Should be able to run on debug printing with HTML tags" do
|
27
|
+
subject.should_receive(:do_system).and_return("Blah blah blah")
|
28
|
+
subject.should_receive(:puts).with('random number<br>')
|
29
|
+
subject.should_receive(:puts).with('Output: <b>Blah blah blah</b><br>')
|
30
|
+
Osaka::ScriptRunner::enable_debug_prints(:short_html)
|
31
|
+
subject.execute("random number")
|
32
|
+
Osaka::ScriptRunner::disable_debug_prints
|
33
|
+
end
|
25
34
|
|
26
35
|
it "Should not print any debugging information by default " do
|
27
36
|
subject.should_receive(:do_system).and_return("")
|