@@ -40,7 +40,8 @@ module Agents |
||
40 | 40 |
If a note with the above title and notebook did note exist already, one would be created. |
41 | 41 |
|
42 | 42 |
- When `mode` is `read` the values are search parameters. |
43 |
- Note: The `content` parameter is not used for searching. |
|
43 |
+ Note: The `content` parameter is not used for searching. Setting `title` only filters |
|
44 |
+ notes whose titles contain `title` as a substring, not as the exact title. |
|
44 | 45 |
|
45 | 46 |
For example, to find all notes with tag 'CS' in the notebook 'xkcd', use: |
46 | 47 |
|
@@ -190,9 +191,11 @@ module Agents |
||
190 | 191 |
|
191 | 192 |
def create_or_update_note(params) |
192 | 193 |
search = Search.new(self, {title: params[:title], notebook: params[:notebook]}) |
194 |
+ |
|
193 | 195 |
# evernote search can only filter notes with titles containing a substring; |
194 | 196 |
# this finds a note with the exact title |
195 | 197 |
note = search.notes.detect {|note| note.title == params[:title]} |
198 |
+ |
|
196 | 199 |
if note |
197 | 200 |
# a note with specified title and notebook exists, so update it |
198 | 201 |
update_note(params.merge(guid: note.guid, notebookGuid: note.notebookGuid)) |
@@ -218,6 +221,7 @@ module Agents |
||
218 | 221 |
params = with_wrapped_content(params) |
219 | 222 |
|
220 | 223 |
# append specified tags instead of replacing current tags |
224 |
+ # evernote will create any new tags |
|
221 | 225 |
tags = getNoteTagNames(params[:guid]) |
222 | 226 |
tags.each { |tag| |
223 | 227 |
params[:tagNames] << tag unless params[:tagNames].include?(tag) } |
@@ -234,7 +238,7 @@ module Agents |
||
234 | 238 |
end |
235 | 239 |
|
236 | 240 |
def build_note(en_note) |
237 |
- notebook = find_notebook(guid: en_note.notebookGuid).name |
|
241 |
+ notebook = find_notebook(guid: en_note.notebookGuid).try(:name) |
|
238 | 242 |
tags = en_note.tagNames || find_tags(en_note.tagGuids.to_a).map(&:name) |
239 | 243 |
Note.new(en_note, notebook, tags) |
240 | 244 |
end |
@@ -276,11 +280,6 @@ module Agents |
||
276 | 280 |
@opts = opts |
277 | 281 |
end |
278 | 282 |
|
279 |
- def filtered_metadata |
|
280 |
- filter, spec = create_filter, create_spec |
|
281 |
- metadata = note_store.findNotesMetadata(filter, 0, 100, spec).notes |
|
282 |
- end |
|
283 |
- |
|
284 | 283 |
def note_guids |
285 | 284 |
filtered_metadata.map(&:guid) |
286 | 285 |
end |
@@ -295,7 +294,7 @@ module Agents |
||
295 | 294 |
# and notes that recently had the specified tags added |
296 | 295 |
metadata.select! do |note_data| |
297 | 296 |
note_data.updated > opts[:last_checked_at] || |
298 |
- (!opts[:notes_with_tags].include?(note_data.guid) && note_data.created > opts[:agent_created_at]) |
|
297 |
+ !opts[:notes_with_tags].include?(note_data.guid) |
|
299 | 298 |
end |
300 | 299 |
|
301 | 300 |
elsif opts[:last_checked_at] |
@@ -306,8 +305,6 @@ module Agents |
||
306 | 305 |
metadata |
307 | 306 |
end |
308 | 307 |
|
309 |
- private |
|
310 |
- |
|
311 | 308 |
def create_filter |
312 | 309 |
filter = Evernote::EDAM::NoteStore::NoteFilter.new |
313 | 310 |
|
@@ -323,6 +320,13 @@ module Agents |
||
323 | 320 |
filter |
324 | 321 |
end |
325 | 322 |
|
323 |
+ private |
|
324 |
+ |
|
325 |
+ def filtered_metadata |
|
326 |
+ filter, spec = create_filter, create_spec |
|
327 |
+ metadata = note_store.findNotesMetadata(filter, 0, 100, spec).notes |
|
328 |
+ end |
|
329 |
+ |
|
326 | 330 |
def create_spec |
327 | 331 |
Evernote::EDAM::NoteStore::NotesMetadataResultSpec.new( |
328 | 332 |
includeTitle: true, |
@@ -1,58 +1,59 @@ |
||
1 | 1 |
require 'spec_helper' |
2 | 2 |
|
3 | 3 |
describe Agents::EvernoteAgent do |
4 |
+ class FakeEvernoteNoteStore |
|
5 |
+ attr_accessor :notes, :tags, :notebooks |
|
6 |
+ def initialize |
|
7 |
+ @notes, @tags, @notebooks = [], [], [] |
|
8 |
+ end |
|
4 | 9 |
|
5 |
- let(:note_store) do |
|
6 |
- class FakeEvernoteNoteStore |
|
7 |
- attr_accessor :notes, :tags, :notebooks |
|
8 |
- def initialize |
|
9 |
- @notes, @tags, @notebooks = [], [], [] |
|
10 |
- end |
|
10 |
+ def createNote(note) |
|
11 |
+ note.attributes = OpenStruct.new(source: nil, sourceURL: nil) |
|
12 |
+ note.guid = @notes.length + 1 |
|
13 |
+ @notes << note |
|
14 |
+ note |
|
15 |
+ end |
|
11 | 16 |
|
12 |
- def createNote(note) |
|
13 |
- note.attributes = OpenStruct.new(source: nil, sourceURL: nil) |
|
14 |
- note.guid = @notes.length + 1 |
|
15 |
- @notes << note |
|
16 |
- note |
|
17 |
- end |
|
17 |
+ def updateNote(note) |
|
18 |
+ note.attributes = OpenStruct.new(source: nil, sourceURL: nil) |
|
19 |
+ old_note = @notes.find {|en_note| en_note.guid == note.guid} |
|
20 |
+ @notes[@notes.index(old_note)] = note |
|
21 |
+ note |
|
22 |
+ end |
|
18 | 23 |
|
19 |
- def updateNote(note) |
|
20 |
- note.attributes = OpenStruct.new(source: nil, sourceURL: nil) |
|
21 |
- old_note = @notes.find {|en_note| en_note.guid == note.guid} |
|
22 |
- @notes[@notes.index(old_note)] = note |
|
23 |
- note |
|
24 |
- end |
|
24 |
+ def getNote(guid, *other_args) |
|
25 |
+ @notes.find {|note| note.guid == guid} |
|
26 |
+ end |
|
25 | 27 |
|
26 |
- def getNote(guid, *other_args) |
|
27 |
- @notes.find {|note| note.guid == guid} |
|
28 |
- end |
|
28 |
+ def createNotebook(notebook) |
|
29 |
+ notebook.guid = @notebooks.length + 1 |
|
30 |
+ @notebooks << notebook |
|
31 |
+ notebook |
|
32 |
+ end |
|
29 | 33 |
|
30 |
- def createNotebook(notebook) |
|
31 |
- notebook.guid = @notebooks.length + 1 |
|
32 |
- @notebooks << notebook |
|
33 |
- notebook |
|
34 |
- end |
|
34 |
+ def createTag(tag) |
|
35 |
+ tag.guid = @tags.length + 1 |
|
36 |
+ @tags << tag |
|
37 |
+ tag |
|
38 |
+ end |
|
35 | 39 |
|
36 |
- def createTag(tag) |
|
37 |
- tag.guid = @tags.length + 1 |
|
38 |
- @tags << tag |
|
39 |
- tag |
|
40 |
- end |
|
40 |
+ def listNotebooks; @notebooks; end |
|
41 | 41 |
|
42 |
- def listNotebooks; @notebooks; end |
|
42 |
+ def listTags; @tags; end |
|
43 | 43 |
|
44 |
- def listTags; @tags; end |
|
44 |
+ def getNoteTagNames(guid) |
|
45 |
+ getNote(guid).try(:tagNames) || [] |
|
46 |
+ end |
|
45 | 47 |
|
46 |
- def getNoteTagNames(guid) |
|
47 |
- getNote(guid).try(:tagNames) || [] |
|
48 |
- end |
|
48 |
+ def findNotesMetadata(*args); end |
|
49 |
+ end |
|
49 | 50 |
|
50 |
- def findNotesMetadata(*args); end |
|
51 |
- end |
|
51 |
+ let(:en_note_store) do |
|
52 |
+ FakeEvernoteNoteStore.new |
|
53 |
+ end |
|
52 | 54 |
|
53 |
- note_store = FakeEvernoteNoteStore.new |
|
54 |
- stub.any_instance_of(Agents::EvernoteAgent).evernote_note_store { note_store } |
|
55 |
- note_store |
|
55 |
+ before do |
|
56 |
+ stub.any_instance_of(Agents::EvernoteAgent).evernote_note_store { en_note_store } |
|
56 | 57 |
end |
57 | 58 |
|
58 | 59 |
describe "#receive" do |
@@ -85,18 +86,18 @@ describe Agents::EvernoteAgent do |
||
85 | 86 |
|
86 | 87 |
tag1 = OpenStruct.new(name: "funny") |
87 | 88 |
tag2 = OpenStruct.new(name: "data") |
88 |
- [tag1, tag2].each { |tag| note_store.createTag(tag) } |
|
89 |
+ [tag1, tag2].each { |tag| en_note_store.createTag(tag) } |
|
89 | 90 |
end |
90 | 91 |
|
91 | 92 |
it "adds a note for any payload it receives" do |
92 |
- stub(note_store).findNotesMetadata { OpenStruct.new(notes: []) } |
|
93 |
+ stub(en_note_store).findNotesMetadata { OpenStruct.new(notes: []) } |
|
93 | 94 |
Agents::EvernoteAgent.async_receive(@agent.id, [@event.id]) |
94 | 95 |
|
95 |
- expect(note_store.notes.size).to eq(1) |
|
96 |
- expect(note_store.notes.first.title).to eq("xkcd Survey") |
|
97 |
- expect(note_store.notebooks.size).to eq(1) |
|
98 |
- expect(note_store.tags.size).to eq(2) |
|
99 |
- |
|
96 |
+ expect(en_note_store.notes.size).to eq(1) |
|
97 |
+ expect(en_note_store.notes.first.title).to eq("xkcd Survey") |
|
98 |
+ expect(en_note_store.notebooks.size).to eq(1) |
|
99 |
+ expect(en_note_store.tags.size).to eq(2) |
|
100 |
+ |
|
100 | 101 |
expect(@agent.events.count).to eq(1) |
101 | 102 |
expect(@agent.events.first.payload).to eq({ |
102 | 103 |
"title" => "xkcd Survey", |
@@ -111,18 +112,18 @@ describe Agents::EvernoteAgent do |
||
111 | 112 |
before do |
112 | 113 |
note1 = OpenStruct.new(title: "xkcd Survey", notebookGuid: 1) |
113 | 114 |
note2 = OpenStruct.new(title: "Footprints", notebookGuid: 1) |
114 |
- [note1, note2].each { |note| note_store.createNote(note) } |
|
115 |
- note_store.createNotebook(OpenStruct.new(name: "xkcd")) |
|
115 |
+ [note1, note2].each { |note| en_note_store.createNote(note) } |
|
116 |
+ en_note_store.createNotebook(OpenStruct.new(name: "xkcd")) |
|
116 | 117 |
|
117 |
- stub(note_store).findNotesMetadata { |
|
118 |
+ stub(en_note_store).findNotesMetadata { |
|
118 | 119 |
OpenStruct.new(notes: [note1]) } |
119 | 120 |
end |
120 | 121 |
|
121 | 122 |
it "updates the existing note" do |
122 | 123 |
Agents::EvernoteAgent.async_receive(@agent.id, [@event.id]) |
123 | 124 |
|
124 |
- expect(note_store.notes.size).to eq(2) |
|
125 |
- expect(note_store.getNote(1).tagNames).to eq(["funny", "data"]) |
|
125 |
+ expect(en_note_store.notes.size).to eq(2) |
|
126 |
+ expect(en_note_store.getNote(1).tagNames).to eq(["funny", "data"]) |
|
126 | 127 |
expect(@agent.events.count).to eq(1) |
127 | 128 |
end |
128 | 129 |
end |
@@ -134,7 +135,7 @@ describe Agents::EvernoteAgent do |
||
134 | 135 |
end |
135 | 136 |
|
136 | 137 |
it "creates an event with note content wrapped in ENML" do |
137 |
- stub(note_store).findNotesMetadata { OpenStruct.new(notes: []) } |
|
138 |
+ stub(en_note_store).findNotesMetadata { OpenStruct.new(notes: []) } |
|
138 | 139 |
Agents::EvernoteAgent.async_receive(@agent.id, [@event.id]) |
139 | 140 |
|
140 | 141 |
payload = @agent.events.first.payload |
@@ -172,19 +173,19 @@ describe Agents::EvernoteAgent do |
||
172 | 173 |
@checker.save! |
173 | 174 |
@checker.created_at = 1.minute.ago |
174 | 175 |
|
175 |
- note_store.createNote( |
|
176 |
+ en_note_store.createNote( |
|
176 | 177 |
OpenStruct.new(title: "xkcd Survey", |
177 | 178 |
notebookGuid: 1, |
178 | 179 |
updated: 2.minutes.ago.to_i * 1000, |
179 | 180 |
tagNames: ["funny", "comic"]) |
180 | 181 |
) |
181 |
- note_store.createNotebook(OpenStruct.new(name: "xkcd")) |
|
182 |
+ en_note_store.createNotebook(OpenStruct.new(name: "xkcd")) |
|
182 | 183 |
tag1 = OpenStruct.new(name: "funny") |
183 | 184 |
tag2 = OpenStruct.new(name: "comic") |
184 |
- [tag1, tag2].each { |tag| note_store.createTag(tag) } |
|
185 |
+ [tag1, tag2].each { |tag| en_note_store.createTag(tag) } |
|
185 | 186 |
|
186 |
- stub(note_store).findNotesMetadata { |
|
187 |
- notes = note_store.notes.select do |note| |
|
187 |
+ stub(en_note_store).findNotesMetadata { |
|
188 |
+ notes = en_note_store.notes.select do |note| |
|
188 | 189 |
note.notebookGuid == 1 && |
189 | 190 |
%w(funny comic).all? { |tag_name| note.tagNames.include?(tag_name) } |
190 | 191 |
end |
@@ -203,13 +204,13 @@ describe Agents::EvernoteAgent do |
||
203 | 204 |
expect { @checker.check }.to change { Event.count }.by(0) |
204 | 205 |
|
205 | 206 |
future_time = (Time.now + 1.minute).to_i * 1000 |
206 |
- note_store.createNote( |
|
207 |
+ en_note_store.createNote( |
|
207 | 208 |
OpenStruct.new(title: "Footprints", |
208 | 209 |
notebookGuid: 1, |
209 | 210 |
tagNames: ["funny", "comic", "recent"], |
210 | 211 |
updated: future_time)) |
211 | 212 |
|
212 |
- note_store.createNote( |
|
213 |
+ en_note_store.createNote( |
|
213 | 214 |
OpenStruct.new(title: "something else", |
214 | 215 |
notebookGuid: 2, |
215 | 216 |
tagNames: ["funny", "comic"], |
@@ -219,7 +220,7 @@ describe Agents::EvernoteAgent do |
||
219 | 220 |
end |
220 | 221 |
|
221 | 222 |
it "returns notes tagged since the last time it checked" do |
222 |
- note_store.createNote( |
|
223 |
+ en_note_store.createNote( |
|
223 | 224 |
OpenStruct.new(title: "Footprints", |
224 | 225 |
notebookGuid: 1, |
225 | 226 |
tagNames: [], |
@@ -227,7 +228,7 @@ describe Agents::EvernoteAgent do |
||
227 | 228 |
updated: Time.now.to_i * 1000)) |
228 | 229 |
@checker.check |
229 | 230 |
|
230 |
- note_store.getNote(2).tagNames = ["funny", "comic"] |
|
231 |
+ en_note_store.getNote(2).tagNames = ["funny", "comic"] |
|
231 | 232 |
|
232 | 233 |
expect { @checker.check }.to change { Event.count }.by(1) |
233 | 234 |
end |
@@ -294,4 +295,282 @@ describe Agents::EvernoteAgent do |
||
294 | 295 |
end |
295 | 296 |
end |
296 | 297 |
end |
298 |
+ |
|
299 |
+ # api wrapper classes |
|
300 |
+ describe Agents::EvernoteAgent::NoteStore do |
|
301 |
+ let(:note_store) { Agents::EvernoteAgent::NoteStore.new(en_note_store) } |
|
302 |
+ |
|
303 |
+ let(:note1) { OpenStruct.new(title: "first note") } |
|
304 |
+ let(:note2) { OpenStruct.new(title: "second note") } |
|
305 |
+ |
|
306 |
+ before do |
|
307 |
+ en_note_store.createNote(note1) |
|
308 |
+ en_note_store.createNote(note2) |
|
309 |
+ end |
|
310 |
+ |
|
311 |
+ describe "#create_note" do |
|
312 |
+ it "creates a note with given params in evernote note store" do |
|
313 |
+ note_store.create_note(title: "third note") |
|
314 |
+ |
|
315 |
+ expect(en_note_store.notes.size).to eq(3) |
|
316 |
+ expect(en_note_store.notes.last.title).to eq("third note") |
|
317 |
+ end |
|
318 |
+ |
|
319 |
+ it "returns a note" do |
|
320 |
+ expect(note_store.create_note(title: "third note")).to be_a(Agents::EvernoteAgent::Note) |
|
321 |
+ end |
|
322 |
+ end |
|
323 |
+ |
|
324 |
+ describe "#update_note" do |
|
325 |
+ it "updates an existing note with given params" do |
|
326 |
+ note_store.update_note(guid: 1, content: "some words") |
|
327 |
+ |
|
328 |
+ expect(en_note_store.notes.first.content).not_to be_nil |
|
329 |
+ expect(en_note_store.notes.size).to eq(2) |
|
330 |
+ end |
|
331 |
+ |
|
332 |
+ it "returns a note" do |
|
333 |
+ expect(note_store.update_note(guid: 1, content: "some words")).to be_a(Agents::EvernoteAgent::Note) |
|
334 |
+ end |
|
335 |
+ end |
|
336 |
+ |
|
337 |
+ describe "#find_note" do |
|
338 |
+ it "gets a note with the given guid" do |
|
339 |
+ note = note_store.find_note(2) |
|
340 |
+ |
|
341 |
+ expect(note.title).to eq("second note") |
|
342 |
+ expect(note).to be_a(Agents::EvernoteAgent::Note) |
|
343 |
+ end |
|
344 |
+ end |
|
345 |
+ |
|
346 |
+ describe "#find_tags" do |
|
347 |
+ let(:tag1) { OpenStruct.new(name: "tag1") } |
|
348 |
+ let(:tag2) { OpenStruct.new(name: "tag2") } |
|
349 |
+ let(:tag3) { OpenStruct.new(name: "tag3") } |
|
350 |
+ |
|
351 |
+ before do |
|
352 |
+ [tag1, tag2, tag3].each { |tag| en_note_store.createTag(tag) } |
|
353 |
+ end |
|
354 |
+ |
|
355 |
+ it "finds tags with the given guids" do |
|
356 |
+ expect(note_store.find_tags([1,3])).to eq([tag1, tag3]) |
|
357 |
+ end |
|
358 |
+ end |
|
359 |
+ |
|
360 |
+ describe "#find_notebook" do |
|
361 |
+ let(:notebook1) { OpenStruct.new(name: "notebook1") } |
|
362 |
+ let(:notebook2) { OpenStruct.new(name: "notebook2") } |
|
363 |
+ |
|
364 |
+ before do |
|
365 |
+ [notebook1, notebook2].each {|notebook| en_note_store.createNotebook(notebook)} |
|
366 |
+ end |
|
367 |
+ |
|
368 |
+ it "finds a notebook with given name" do |
|
369 |
+ expect(note_store.find_notebook(name: "notebook1")).to eq(notebook1) |
|
370 |
+ expect(note_store.find_notebook(name: "notebook3")).to be_nil |
|
371 |
+ end |
|
372 |
+ |
|
373 |
+ it "finds a notebook with a given guid" do |
|
374 |
+ expect(note_store.find_notebook(guid: 2)).to eq(notebook2) |
|
375 |
+ expect(note_store.find_notebook(guid: 3)).to be_nil |
|
376 |
+ end |
|
377 |
+ end |
|
378 |
+ |
|
379 |
+ describe "#create_or_update_note" do |
|
380 |
+ let(:notebook1) { OpenStruct.new(name: "first notebook")} |
|
381 |
+ |
|
382 |
+ before do |
|
383 |
+ en_note_store.createNotebook(notebook1) |
|
384 |
+ end |
|
385 |
+ |
|
386 |
+ context "a note with given title and notebook does not exist" do |
|
387 |
+ before do |
|
388 |
+ stub(en_note_store).findNotesMetadata { OpenStruct.new(notes: []) } |
|
389 |
+ end |
|
390 |
+ |
|
391 |
+ it "creates a note" do |
|
392 |
+ result = note_store.create_or_update_note(title: "third note", notebook: "first notebook") |
|
393 |
+ |
|
394 |
+ expect(result).to be_a(Agents::EvernoteAgent::Note) |
|
395 |
+ expect(en_note_store.getNote(3)).to_not be_nil |
|
396 |
+ end |
|
397 |
+ |
|
398 |
+ it "also creates the notebook if it does not exist" do |
|
399 |
+ note_store.create_or_update_note(title: "third note", notebook: "second notebook") |
|
400 |
+ |
|
401 |
+ expect(note_store.find_notebook(name: "second notebook")).to_not be_nil |
|
402 |
+ end |
|
403 |
+ end |
|
404 |
+ |
|
405 |
+ context "such a note does exist" do |
|
406 |
+ let(:note) { OpenStruct.new(title: "a note", notebookGuid: 1) } |
|
407 |
+ |
|
408 |
+ before do |
|
409 |
+ en_note_store.createNote(note) |
|
410 |
+ stub(en_note_store).findNotesMetadata { OpenStruct.new(notes: [note]) } |
|
411 |
+ end |
|
412 |
+ |
|
413 |
+ it "updates the note" do |
|
414 |
+ prior_note_count = en_note_store.notes.size |
|
415 |
+ |
|
416 |
+ result = note_store.create_or_update_note( |
|
417 |
+ title: "a note", notebook: "first notebook", content: "test content") |
|
418 |
+ |
|
419 |
+ expect(result).to be_a(Agents::EvernoteAgent::Note) |
|
420 |
+ expect(en_note_store.notes.size).to eq(prior_note_count) |
|
421 |
+ expect(en_note_store.getNote(3).content).to include("test content") |
|
422 |
+ end |
|
423 |
+ end |
|
424 |
+ end |
|
425 |
+ end |
|
426 |
+ |
|
427 |
+ describe Agents::EvernoteAgent::NoteStore::Search do |
|
428 |
+ let(:note_store) { Agents::EvernoteAgent::NoteStore.new(en_note_store) } |
|
429 |
+ |
|
430 |
+ let(:note1) { |
|
431 |
+ OpenStruct.new(title: "first note", notebookGuid: 1, tagNames: ["funny", "comic"], updated: Time.now) } |
|
432 |
+ let(:note2) { |
|
433 |
+ OpenStruct.new(title: "second note", tagNames: ["funny", "comic"], updated: Time.now) } |
|
434 |
+ let(:note3) { |
|
435 |
+ OpenStruct.new(title: "third note", notebookGuid: 1, updated: Time.now - 2.minutes) } |
|
436 |
+ |
|
437 |
+ let(:search) do |
|
438 |
+ Agents::EvernoteAgent::NoteStore::Search.new(note_store, |
|
439 |
+ { tagNames: ["funny", "comic"], notebook: "xkcd" }) |
|
440 |
+ end |
|
441 |
+ |
|
442 |
+ let(:search_with_time) do |
|
443 |
+ Agents::EvernoteAgent::NoteStore::Search.new(note_store, |
|
444 |
+ { notebook: "xkcd", last_checked_at: Time.now - 1.minute }) |
|
445 |
+ end |
|
446 |
+ |
|
447 |
+ let(:search_with_time_and_tags) do |
|
448 |
+ Agents::EvernoteAgent::NoteStore::Search.new(note_store, |
|
449 |
+ { notebook: "xkcd", tagNames: ["funny", "comic"], notes_with_tags: [1], last_checked_at: Time.now - 1.minute }) |
|
450 |
+ end |
|
451 |
+ |
|
452 |
+ before do |
|
453 |
+ en_note_store.createTag(OpenStruct.new(name: "funny")) |
|
454 |
+ en_note_store.createTag(OpenStruct.new(name: "comic")) |
|
455 |
+ en_note_store.createNotebook(OpenStruct.new(name: "xkcd")) |
|
456 |
+ |
|
457 |
+ [note1, note2, note3].each { |note| en_note_store.createNote(note) } |
|
458 |
+ end |
|
459 |
+ |
|
460 |
+ describe "#note_guids" do |
|
461 |
+ it "returns the guids of notes satisfying search options" do |
|
462 |
+ stub(en_note_store).findNotesMetadata { OpenStruct.new(notes: [note1]) } |
|
463 |
+ result = search.note_guids |
|
464 |
+ |
|
465 |
+ expect(result.size).to eq(1) |
|
466 |
+ expect(result.first).to eq(1) |
|
467 |
+ end |
|
468 |
+ end |
|
469 |
+ |
|
470 |
+ describe "#notes" do |
|
471 |
+ context "last_checked_at is not set" do |
|
472 |
+ it "returns notes satisfying the search options" do |
|
473 |
+ stub(en_note_store).findNotesMetadata { OpenStruct.new(notes: [note1]) } |
|
474 |
+ result = search.notes |
|
475 |
+ |
|
476 |
+ expect(result.size).to eq(1) |
|
477 |
+ expect(result.first.title).to eq("first note") |
|
478 |
+ expect(result.first).to be_a(Agents::EvernoteAgent::Note) |
|
479 |
+ end |
|
480 |
+ end |
|
481 |
+ |
|
482 |
+ context "last_checked_at is set" do |
|
483 |
+ context "notes_with_tags is not set" do |
|
484 |
+ it "only returns notes updated since then" do |
|
485 |
+ stub(en_note_store).findNotesMetadata { OpenStruct.new(notes: [note1, note3]) } |
|
486 |
+ result = search_with_time.notes |
|
487 |
+ |
|
488 |
+ expect(result.size).to eq(1) |
|
489 |
+ expect(result.first.title).to eq("first note") |
|
490 |
+ end |
|
491 |
+ end |
|
492 |
+ |
|
493 |
+ context "notes_with_tags is set" do |
|
494 |
+ it "returns notes updated since then or notes with recently added tags" do |
|
495 |
+ note3.tagNames = ["funny", "comic"] |
|
496 |
+ stub(en_note_store).findNotesMetadata { OpenStruct.new(notes: [note1, note3]) } |
|
497 |
+ |
|
498 |
+ result = search_with_time_and_tags.notes |
|
499 |
+ expect(result.size).to eq(2) |
|
500 |
+ expect(result.last.title).to eq("third note") |
|
501 |
+ end |
|
502 |
+ end |
|
503 |
+ end |
|
504 |
+ end |
|
505 |
+ |
|
506 |
+ describe "#create_filter" do |
|
507 |
+ it "builds an evernote search filter using search grammar" do |
|
508 |
+ filter = search.create_filter |
|
509 |
+ expect(filter.words).to eq("notebook:\"xkcd\" tag:funny tag:comic") |
|
510 |
+ end |
|
511 |
+ end |
|
512 |
+ end |
|
513 |
+ |
|
514 |
+ describe Agents::EvernoteAgent::Note do |
|
515 |
+ let(:resource) { |
|
516 |
+ OpenStruct.new(mime: "image/png", |
|
517 |
+ attributes: OpenStruct.new(sourceURL: "http://imgs.xkcd.com/comics/xkcd_survey.png", fileName: "xkcd_survey.png")) |
|
518 |
+ } |
|
519 |
+ |
|
520 |
+ let(:en_note_attributes) { |
|
521 |
+ OpenStruct.new(source: "web.clip", sourceURL: "http://xkcd.com/1572/") |
|
522 |
+ } |
|
523 |
+ |
|
524 |
+ let(:en_note) { |
|
525 |
+ OpenStruct.new(title: "xkcd Survey", |
|
526 |
+ tagNames: ["funny", "data"], |
|
527 |
+ content: "The xkcd Survey: Big Data for a Big Planet", |
|
528 |
+ attributes: en_note_attributes, |
|
529 |
+ resources: [resource]) |
|
530 |
+ } |
|
531 |
+ |
|
532 |
+ describe "#attr" do |
|
533 |
+ let(:note) { |
|
534 |
+ Agents::EvernoteAgent::Note.new(en_note, "xkcd", ["funny", "data"]) |
|
535 |
+ } |
|
536 |
+ |
|
537 |
+ context "when no option is set" do |
|
538 |
+ it "returns a hash with title, tags, notebook, source and source url" do |
|
539 |
+ expect(note.attr).to eq( |
|
540 |
+ { |
|
541 |
+ title: en_note.title, |
|
542 |
+ notebook: "xkcd", |
|
543 |
+ tags: ["funny", "data"], |
|
544 |
+ source: en_note.attributes.source, |
|
545 |
+ source_url: en_note.attributes.sourceURL |
|
546 |
+ } |
|
547 |
+ ) |
|
548 |
+ end |
|
549 |
+ end |
|
550 |
+ |
|
551 |
+ context "when include_content is set to true" do |
|
552 |
+ it "includes content" do |
|
553 |
+ note_attr = note.attr(include_content: true) |
|
554 |
+ |
|
555 |
+ expect(note_attr[:content]).to eq( |
|
556 |
+ "The xkcd Survey: Big Data for a Big Planet" |
|
557 |
+ ) |
|
558 |
+ end |
|
559 |
+ end |
|
560 |
+ |
|
561 |
+ context "when include_resources is set to true" do |
|
562 |
+ it "includes resources" do |
|
563 |
+ note_attr = note.attr(include_resources: true) |
|
564 |
+ |
|
565 |
+ expect(note_attr[:resources].first).to eq( |
|
566 |
+ { |
|
567 |
+ url: resource.attributes.sourceURL, |
|
568 |
+ name: resource.attributes.fileName, |
|
569 |
+ mime_type: resource.mime |
|
570 |
+ } |
|
571 |
+ ) |
|
572 |
+ end |
|
573 |
+ end |
|
574 |
+ end |
|
575 |
+ end |
|
297 | 576 |
end |