osaka 0.2.3 → 0.3.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/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("")
|