pincerna 1.1.3
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.
- checksums.yaml +7 -0
- data/.gitignore +7 -0
- data/.rubocop.yml +77 -0
- data/.travis-gemfile +17 -0
- data/.travis.yml +7 -0
- data/.yardopts +1 -0
- data/CHANGELOG.md +3 -0
- data/Gemfile +23 -0
- data/LICENSE.md +21 -0
- data/README.md +211 -0
- data/Rakefile +45 -0
- data/bin/pincernad +56 -0
- data/docs/Pincerna.html +130 -0
- data/docs/Pincerna/Base.html +3051 -0
- data/docs/Pincerna/Bookmark.html +523 -0
- data/docs/Pincerna/Cache.html +767 -0
- data/docs/Pincerna/ChromeBookmark.html +308 -0
- data/docs/Pincerna/CurrencyConversion.html +589 -0
- data/docs/Pincerna/FirefoxBookmark.html +328 -0
- data/docs/Pincerna/Ip.html +1017 -0
- data/docs/Pincerna/Map.html +399 -0
- data/docs/Pincerna/SafariBookmark.html +308 -0
- data/docs/Pincerna/Server.html +673 -0
- data/docs/Pincerna/Translation.html +517 -0
- data/docs/Pincerna/UnitConversion.html +1042 -0
- data/docs/Pincerna/Version.html +189 -0
- data/docs/Pincerna/Vpn.html +561 -0
- data/docs/Pincerna/Weather.html +837 -0
- data/docs/_index.html +298 -0
- data/docs/class_list.html +54 -0
- data/docs/css/common.css +1 -0
- data/docs/css/full_list.css +57 -0
- data/docs/css/style.css +338 -0
- data/docs/file.README.html +327 -0
- data/docs/file_list.html +56 -0
- data/docs/frames.html +28 -0
- data/docs/index.html +327 -0
- data/docs/js/app.js +214 -0
- data/docs/js/full_list.js +178 -0
- data/docs/js/jquery.js +4 -0
- data/docs/method_list.html +389 -0
- data/docs/top-level-namespace.html +112 -0
- data/icon.png +0 -0
- data/images/chrome.png +0 -0
- data/images/currency.png +0 -0
- data/images/firefox.png +0 -0
- data/images/map.png +0 -0
- data/images/network.png +0 -0
- data/images/safari.png +0 -0
- data/images/translate.png +0 -0
- data/images/unit.png +0 -0
- data/images/vpn.png +0 -0
- data/images/weather.png +0 -0
- data/info.plist +961 -0
- data/it.cowtech.pincernad.plist +19 -0
- data/lib/pincerna.rb +30 -0
- data/lib/pincerna/base.rb +258 -0
- data/lib/pincerna/bookmark.rb +80 -0
- data/lib/pincerna/cache.rb +61 -0
- data/lib/pincerna/chrome_bookmark.rb +40 -0
- data/lib/pincerna/currency_conversion.rb +134 -0
- data/lib/pincerna/firefox_bookmark.rb +92 -0
- data/lib/pincerna/ip.rb +135 -0
- data/lib/pincerna/map.rb +30 -0
- data/lib/pincerna/safari_bookmark.rb +40 -0
- data/lib/pincerna/server.rb +85 -0
- data/lib/pincerna/translation.rb +67 -0
- data/lib/pincerna/unit_conversion.rb +120 -0
- data/lib/pincerna/version.rb +24 -0
- data/lib/pincerna/vpn.rb +74 -0
- data/lib/pincerna/weather.rb +188 -0
- data/pincerna.alfredworkflow +0 -0
- data/pincerna.gemspec +36 -0
- data/pincerna.sh +9 -0
- data/spec/cassettes/Pincerna_CurrencyConversion/_perform_filtering/should_return_valid_values.yml +38 -0
- data/spec/cassettes/Pincerna_Ip/_get_local_addresses/should_return_a_list_of_addresses.yml +47 -0
- data/spec/cassettes/Pincerna_Ip/_get_public_address/should_return_public_IP_address.yml +44 -0
- data/spec/cassettes/Pincerna_Translation/_perform_filtering/should_default_from_English_to_the_given_language_when_only_one_is_present.yml +124 -0
- data/spec/cassettes/Pincerna_Translation/_perform_filtering/should_query_Google_Translate_for_sentences_returning_no_alternatives.yml +51 -0
- data/spec/cassettes/Pincerna_Translation/_perform_filtering/should_query_Google_Translate_for_single_words.yml +71 -0
- data/spec/cassettes/Pincerna_Weather/_get_forecast/should_append_name.yml +177 -0
- data/spec/cassettes/Pincerna_Weather/_get_forecast/should_get_correct_forecasts.yml +339 -0
- data/spec/cassettes/Pincerna_Weather/_lookup_places/should_return_an_existing_WOEID_without_making_any_request.yml +56 -0
- data/spec/cassettes/Pincerna_Weather/_lookup_places/should_search_for_places.yml +189 -0
- data/spec/cassettes/Pincerna_Weather/_perform_filtering/should_get_forecast.yml +56 -0
- data/spec/coverage_helper.rb +44 -0
- data/spec/pincerna/base_spec.rb +166 -0
- data/spec/pincerna/bookmark_spec.rb +65 -0
- data/spec/pincerna/cache_spec.rb +88 -0
- data/spec/pincerna/chrome_bookmark_spec.rb +114 -0
- data/spec/pincerna/currency_conversion_spec.rb +46 -0
- data/spec/pincerna/firefox_bookmark_spec.rb +46 -0
- data/spec/pincerna/ip_spec.rb +194 -0
- data/spec/pincerna/map_spec.rb +24 -0
- data/spec/pincerna/safari_bookmark_spec.rb +237 -0
- data/spec/pincerna/server_spec.rb +108 -0
- data/spec/pincerna/translation_spec.rb +55 -0
- data/spec/pincerna/unit_conversion_spec.rb +98 -0
- data/spec/pincerna/vpn_spec.rb +68 -0
- data/spec/pincerna/weather_spec.rb +131 -0
- data/spec/spec_helper.rb +48 -0
- metadata +283 -0
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
#
|
|
3
|
+
# This file is part of the pincerna gem. Copyright (C) 2013 and above Shogun <shogun@cowtech.it>.
|
|
4
|
+
# Licensed under the MIT license, which can be found at https://choosealicense.com/licenses/mit.
|
|
5
|
+
#
|
|
6
|
+
|
|
7
|
+
require "goliath/test_helper"
|
|
8
|
+
require "spec_helper"
|
|
9
|
+
require "pincerna/server"
|
|
10
|
+
|
|
11
|
+
describe Pincerna::Server do
|
|
12
|
+
include Goliath::TestHelper
|
|
13
|
+
|
|
14
|
+
subject{ ::Pincerna::Server.new }
|
|
15
|
+
|
|
16
|
+
before(:each) do
|
|
17
|
+
allow(subject).to receive(:params).and_return({})
|
|
18
|
+
allow(EM::Synchrony).to receive(:sleep)
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
describe ".enqueue_request" do
|
|
22
|
+
before(:each) do
|
|
23
|
+
allow(Time).to receive(:now).and_return(1)
|
|
24
|
+
expect(EM::Synchrony).to receive(:sleep).with(Pincerna::Server::DELAY)
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
it "should enqueue a request" do
|
|
28
|
+
Pincerna::Server.enqueue_request
|
|
29
|
+
expect(Pincerna::Server.instance_variable_get(:@requests).pop).to eq(1)
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
describe ".perform_request?" do
|
|
34
|
+
it "should check if the request must be performed" do
|
|
35
|
+
queue = Queue.new
|
|
36
|
+
Pincerna::Server.instance_variable_set(:@requests, queue)
|
|
37
|
+
queue << 1
|
|
38
|
+
expect(Pincerna::Server.perform_request?).to be_true
|
|
39
|
+
queue << 2
|
|
40
|
+
queue << 3
|
|
41
|
+
expect(Pincerna::Server.perform_request?).to be_false
|
|
42
|
+
end
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
describe "#handle_request" do
|
|
46
|
+
before(:each) do
|
|
47
|
+
@queue = Queue.new
|
|
48
|
+
Pincerna::Server.instance_variable_set(:@requests, @queue)
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
it "should handle valid requests" do
|
|
52
|
+
expect(Pincerna::Base).to receive(:execute!).with("map", "Campobasso", "YML", "NO").and_call_original
|
|
53
|
+
allow_any_instance_of(Pincerna::Base).to receive(:output).and_return("RESPONSE")
|
|
54
|
+
expect(subject.handle_request("map", {"q" => "Campobasso ", "format" => "YML", "debug" => "NO"})).to eq([200, {"Content-Type" => "text/x-yaml"}, "RESPONSE"])
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
it "should handle invalid requests" do
|
|
58
|
+
expect(subject.handle_request("mappa", {"q" => "Campobasso ", "format" => "YML", "debug" => "NO"})).to eq([404, {"Content-Type" => "text/plain"}, ""])
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
it "should handle outdated requests" do
|
|
62
|
+
@queue << 1
|
|
63
|
+
|
|
64
|
+
expect(Pincerna::Base).not_to receive(:execute!)
|
|
65
|
+
expect(subject.handle_request("mappa", {"q" => "Campobasso ", "format" => "YML", "debug" => "NO"})).to eq([429, {"Content-Type" => "text/plain"}, ""])
|
|
66
|
+
end
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
describe "#handle_stop" do
|
|
70
|
+
it "should setup a callback and return 200" do
|
|
71
|
+
expect(EM).to receive(:add_timer).with(0.1)
|
|
72
|
+
expect(subject.handle_stop).to eq([200, {}, ""])
|
|
73
|
+
end
|
|
74
|
+
end
|
|
75
|
+
|
|
76
|
+
describe "#stop_server" do
|
|
77
|
+
it "should destroy the cache and stop EM in the callback" do
|
|
78
|
+
allow_any_instance_of(EventMachine::PeriodicTimer).to receive(:schedule)
|
|
79
|
+
expect(Pincerna::Cache.instance).to receive(:destroy).and_call_original
|
|
80
|
+
expect(EM).to receive(:stop)
|
|
81
|
+
subject.send(:stop_server)
|
|
82
|
+
end
|
|
83
|
+
end
|
|
84
|
+
|
|
85
|
+
describe "#response" do
|
|
86
|
+
before(:each) do
|
|
87
|
+
allow(subject).to receive(:handle_request).and_return([1, {}, ""])
|
|
88
|
+
allow(subject).to receive(:handle_stop).and_return([2, {}, ""])
|
|
89
|
+
allow(subject).to receive(:handle_install).and_return([3, {}, ""])
|
|
90
|
+
allow(subject).to receive(:handle_uninstall).and_return([4, {}, ""])
|
|
91
|
+
end
|
|
92
|
+
|
|
93
|
+
it "should return the response" do
|
|
94
|
+
expect(subject.response({"REQUEST_PATH" => "/"})).to eq([1, {}, ""])
|
|
95
|
+
expect(subject.response({"REQUEST_PATH" => "foo/quit"})).to eq([1, {}, ""])
|
|
96
|
+
expect(subject.response({"REQUEST_PATH" => "/quit"})).to eq([2, {}, ""])
|
|
97
|
+
expect(subject.response({"REQUEST_PATH" => "/install"})).to eq([3, {}, ""])
|
|
98
|
+
expect(subject.response({"REQUEST_PATH" => "/uninstall"})).to eq([4, {}, ""])
|
|
99
|
+
end
|
|
100
|
+
|
|
101
|
+
it "should handle exceptions" do
|
|
102
|
+
allow(subject).to receive(:handle_request).and_raise(RuntimeError.new("NO"))
|
|
103
|
+
response = subject.response({"REQUEST_PATH" => "/"})
|
|
104
|
+
expect(response[0]).to eq(500)
|
|
105
|
+
expect(response[1]).to eq({"X-Error" => "RuntimeError", "X-Error-Message" => "NO", "Content-Type" => "text/plain"})
|
|
106
|
+
end
|
|
107
|
+
end
|
|
108
|
+
end
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
#
|
|
3
|
+
# This file is part of the pincerna gem. Copyright (C) 2013 and above Shogun <shogun@cowtech.it>.
|
|
4
|
+
# Licensed under the MIT license, which can be found at https://choosealicense.com/licenses/mit.
|
|
5
|
+
#
|
|
6
|
+
|
|
7
|
+
require "spec_helper"
|
|
8
|
+
|
|
9
|
+
describe Pincerna::Translation do
|
|
10
|
+
subject { Pincerna::Translation.new("QUERY", "yml") }
|
|
11
|
+
|
|
12
|
+
describe "matching" do
|
|
13
|
+
it "should match valid queries" do
|
|
14
|
+
allow_any_instance_of(Pincerna::Translation).to receive(:perform_filtering) { |*args| args }
|
|
15
|
+
allow_any_instance_of(Pincerna::Translation).to receive(:process_results) { |*args| args }
|
|
16
|
+
|
|
17
|
+
expect(Pincerna::Translation.new("zh-cn en FOO", "yml").filter).to eq_as_yaml([["zh-cn", "en", "FOO"]])
|
|
18
|
+
expect(Pincerna::Translation.new("IT to EN FOO", "yml").filter).to eq_as_yaml([["it", "en", "FOO"]])
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
it "should not match invalid queries" do
|
|
22
|
+
expect_any_instance_of(Pincerna::Translation).not_to receive(:perform_filtering)
|
|
23
|
+
expect_any_instance_of(Pincerna::Translation).not_to receive(:process_results)
|
|
24
|
+
|
|
25
|
+
expect(Pincerna::Translation.new("abc", "yml").filter).to eq_as_yaml([])
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
describe "#perform_filtering", :vcr, :synchronous do
|
|
30
|
+
before(:each) do
|
|
31
|
+
cache = Object.new
|
|
32
|
+
allow(cache).to receive(:use).and_yield
|
|
33
|
+
allow(Pincerna::Cache).to receive(:instance).and_return(cache)
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
it "should query Google Translate for single words" do
|
|
37
|
+
expect(subject.perform_filtering("it", "en", "Ciao")).to eq({main: "Hello!", alternatives: ["Hi!", "Bye-Bye!", "Bye!", "So long!", "Cheerio!", "Hallo!", "Hullo!"]})
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
it "should query Google Translate for sentences, returning no alternatives" do
|
|
41
|
+
expect(subject.perform_filtering("it", "en", "Ciao, come stai?")).to eq({main: "Hello, how are you?"})
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
it "should default from English to the given language when only one is present" do
|
|
45
|
+
expect(subject.perform_filtering("it", nil, "do")).to eq({main: "fare", alternatives: ["eseguire", "compiere", "agire", "operare", "comportarsi", "commettere", "stare", "bastare", "causare", "finire", "andare bene", "andar bene", "portare a termine", "procurare", "imbrogliare", "ingannare", "passarsela", "visitare", "combinare", "concludere"]})
|
|
46
|
+
end
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
describe "#process_results" do
|
|
50
|
+
it "should correctly prepare results" do
|
|
51
|
+
expect(subject.process_results({main: "fare", alternatives: ["eseguire", "compiere"]})).to eq([{title: "fare", arg: "fare", subtitle: "Alternatives: eseguire, compiere", icon: Pincerna::Translation::ICON}])
|
|
52
|
+
expect(subject.process_results({main: "Hello, how are you?"})).to eq([{title: "Hello, how are you?", arg: "Hello, how are you?", subtitle: "Action this item to copy the translation on the clipboard.", icon: Pincerna::Translation::ICON}])
|
|
53
|
+
end
|
|
54
|
+
end
|
|
55
|
+
end
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
#
|
|
3
|
+
# This file is part of the pincerna gem. Copyright (C) 2013 and above Shogun <shogun@cowtech.it>.
|
|
4
|
+
# Licensed under the MIT license, which can be found at https://choosealicense.com/licenses/mit.
|
|
5
|
+
#
|
|
6
|
+
|
|
7
|
+
require "spec_helper"
|
|
8
|
+
|
|
9
|
+
describe Pincerna::UnitConversion do
|
|
10
|
+
subject { Pincerna::UnitConversion.new("QUERY", "yml") }
|
|
11
|
+
|
|
12
|
+
describe ".define_unit" do
|
|
13
|
+
before(:each) do
|
|
14
|
+
unit = Object.new
|
|
15
|
+
expect(RubyUnits::Unit).to receive(:define).with("UNIT").and_call_original
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
it "should define a new unit" do
|
|
19
|
+
expect {
|
|
20
|
+
Pincerna::UnitConversion.define_unit("UNIT", "1 m", ["UNIT", "UU"])
|
|
21
|
+
Unit.new("3 UNIT")
|
|
22
|
+
Unit.new("3 UU")
|
|
23
|
+
}.not_to raise_error
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
describe "matching" do
|
|
28
|
+
it "should match valid queries" do
|
|
29
|
+
allow_any_instance_of(Pincerna::UnitConversion).to receive(:perform_filtering) { |*args| args }
|
|
30
|
+
allow_any_instance_of(Pincerna::UnitConversion).to receive(:process_results) { |*args| args }
|
|
31
|
+
|
|
32
|
+
expect(Pincerna::UnitConversion.new("123 m to F", "yml").filter).to eq_as_yaml([[123.0, "m", "F", false, false]])
|
|
33
|
+
expect(Pincerna::UnitConversion.new("-123.45 oz kg split units", "yml").filter).to eq_as_yaml([[-123.45, "oz", "kg", false, true]])
|
|
34
|
+
expect(Pincerna::UnitConversion.new("123 m to yd with rate", "yml").filter).to eq_as_yaml([[123.0, "m", "yd", true, false]])
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
it "should not match invalid queries" do
|
|
38
|
+
expect_any_instance_of(Pincerna::UnitConversion).not_to receive(:perform_filtering)
|
|
39
|
+
expect_any_instance_of(Pincerna::UnitConversion).not_to receive(:process_results)
|
|
40
|
+
|
|
41
|
+
expect(Pincerna::UnitConversion.new("12A3 EUR to GBP", "yml").filter).to eq_as_yaml([])
|
|
42
|
+
end
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
describe "#perform_filtering" do
|
|
46
|
+
it "should return valid values" do
|
|
47
|
+
converted = subject.perform_filtering(123, "mi", "km", "RATE", "SPLIT")
|
|
48
|
+
expect(converted.delete(:value)).to eq_as_unit(Unit.new("123 mi"))
|
|
49
|
+
expect(converted.delete(:unit)).to eq_as_unit(Unit.new("1 mi"))
|
|
50
|
+
expect(converted.delete(:result)).to eq_as_unit(Unit.new("197.949312 km"))
|
|
51
|
+
expect(converted.delete(:rate)).to eq_as_unit(Unit.new("1.609344 km"))
|
|
52
|
+
expect(converted).to eq({from: "mi", to: "km", with_rate: "RATE", multiple: "SPLIT"})
|
|
53
|
+
end
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
describe "#process_results" do
|
|
57
|
+
before(:each) do
|
|
58
|
+
@value = {value: Unit.new("123 kg"), from: "kg", to: "oz", unit: Unit.new("1 kg"), result: Unit.new("4338.69 oz"), rate: Unit.new("35.278 oz"), with_rate: nil, multiple: nil}
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
it "should correctly prepare results" do
|
|
62
|
+
expect(subject.process_results(@value)).to eq([{title: "123 kg = 4338.690 oz", arg: 4338.69, subtitle: "Action this item to copy the converted amount on the clipboard.", icon: Pincerna::UnitConversion::ICON}])
|
|
63
|
+
expect(subject.process_results(@value.merge(with_rate: true))).to eq([{title: "123 kg = 4338.690 oz (1 kg = 35.278 oz)", arg: 4338.69, subtitle: "Action this item to copy the converted amount on the clipboard.", icon: Pincerna::UnitConversion::ICON}])
|
|
64
|
+
expect(subject.process_results(@value.merge(multiple: true))).to eq([{title: "123 kg = 271 lbs 2 oz", arg: 4338.69, subtitle: "Action this item to copy the converted amount on the clipboard.", icon: Pincerna::UnitConversion::ICON}])
|
|
65
|
+
expect(subject.process_results(@value.merge(with_rate: true, multiple: true))).to eq([{title: "123 kg = 271 lbs 2 oz (1 kg = 2 lbs 3 oz)", arg: 4338.69, subtitle: "Action this item to copy the converted amount on the clipboard.", icon: Pincerna::UnitConversion::ICON}])
|
|
66
|
+
end
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
describe "#check_temperature" do
|
|
70
|
+
it "should correctly convert a temperature unit" do
|
|
71
|
+
expect(subject.check_temperature("C")).to eq("tempC")
|
|
72
|
+
expect(subject.check_temperature("c")).to eq("tempC")
|
|
73
|
+
expect(subject.check_temperature("F")).to eq("tempF")
|
|
74
|
+
expect(subject.check_temperature("°K")).to eq("tempK")
|
|
75
|
+
expect(subject.check_temperature("m")).to eq("m")
|
|
76
|
+
end
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
describe "#convert_value" do
|
|
80
|
+
it "should correctly convert units" do
|
|
81
|
+
expect(subject.convert_value(1, "mi", "km")).to eq_as_unit(Unit.new("1.609344 mi"))
|
|
82
|
+
expect(subject.convert_value(1, "gal", "L")).to eq_as_unit(Unit.new("3.785411784 L"))
|
|
83
|
+
end
|
|
84
|
+
end
|
|
85
|
+
|
|
86
|
+
describe "#format_value" do
|
|
87
|
+
it "should correctly format values" do
|
|
88
|
+
expect(subject.format_value(Unit.new("123.456789 oz"))).to eq("123.457 oz")
|
|
89
|
+
expect(subject.format_value(Unit.new("123.456789 oz"), nil, 1)).to eq("123.5 oz")
|
|
90
|
+
expect(subject.format_value(Unit.new("123.456789 oz"), :raw)).to eq(123.457)
|
|
91
|
+
expect(subject.format_value(Unit.new("123.456789 oz"), :raw, 6)).to eq(123.456789)
|
|
92
|
+
expect(subject.format_value(Unit.new("123.456789 oz"), true)).to eq("7 lbs 11 oz")
|
|
93
|
+
expect(subject.format_value(Unit.new("123.456789 oz"), true, 6)).to eq("7 lbs 11 oz")
|
|
94
|
+
expect(subject.format_value(Unit.new("123.00000 oz"))).to eq("123 oz")
|
|
95
|
+
expect(subject.format_value(Unit.new("123.000123 oz"))).to eq("123 oz")
|
|
96
|
+
end
|
|
97
|
+
end
|
|
98
|
+
end
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
#
|
|
3
|
+
# This file is part of the pincerna gem. Copyright (C) 2013 and above Shogun <shogun@cowtech.it>.
|
|
4
|
+
# Licensed under the MIT license, which can be found at https://choosealicense.com/licenses/mit.
|
|
5
|
+
#
|
|
6
|
+
|
|
7
|
+
require "spec_helper"
|
|
8
|
+
|
|
9
|
+
describe Pincerna::Vpn do
|
|
10
|
+
subject { Pincerna::Vpn.new("QUERY", "yml") }
|
|
11
|
+
|
|
12
|
+
describe "#perform_filtering" do
|
|
13
|
+
before(:each) do
|
|
14
|
+
allow(subject).to receive(:vpn_connected?) {|name| name == "VPN 2" }
|
|
15
|
+
|
|
16
|
+
allow(subject).to receive(:execute_command).with("/usr/sbin/networksetup", "-listnetworkserviceorder").and_return(<<EOVPN
|
|
17
|
+
An asterisk (*) denotes that a network service is disabled.
|
|
18
|
+
(1) Bluetooth DUN
|
|
19
|
+
(Hardware Port: Bluetooth DUN, Device: Bluetooth-Modem)
|
|
20
|
+
|
|
21
|
+
(2) Ethernet
|
|
22
|
+
(Hardware Port: Ethernet, Device: en0)
|
|
23
|
+
|
|
24
|
+
(3) VPN 1
|
|
25
|
+
(Hardware Port: IPSec, Device: )
|
|
26
|
+
|
|
27
|
+
(4) VPN 2
|
|
28
|
+
(Hardware Port: IPSec, Device: )
|
|
29
|
+
|
|
30
|
+
(5) VPAN 3
|
|
31
|
+
(Hardware Port: L2TP, Device: )
|
|
32
|
+
EOVPN
|
|
33
|
+
)
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
describe "should return the correct list of the VPN and their statuses" do
|
|
37
|
+
it "with no query" do
|
|
38
|
+
expect(subject.perform_filtering("")).to eq([{name: "VPN 1", connected: false}, {name: "VPN 2", connected: true}, {name: "VPAN 3", connected: false}])
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
it "with query" do
|
|
42
|
+
expect(subject.perform_filtering("VPN")).to eq([{name: "VPN 1", connected: false}, {name: "VPN 2", connected: true}])
|
|
43
|
+
expect(subject.perform_filtering("3")).to eq([{name: "VPAN 3", connected: false}])
|
|
44
|
+
end
|
|
45
|
+
end
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
describe "#process_results" do
|
|
49
|
+
it "should correctly prepare results" do
|
|
50
|
+
expect(subject.process_results([{name: "VPN 1", connected: true}, {name: "VPN 2", connected: false}])).to eq([
|
|
51
|
+
{title: "Disconnect from VPN 1", arg: "disconnect service \"VPN 1\"", subtitle: "Action this item to disconnect from the VPN service.", icon: Pincerna::Vpn::ICON},
|
|
52
|
+
{title: "Connect to VPN 2", arg: "connect service \"VPN 2\"", subtitle: "Action this item to connect to the VPN service.", icon: Pincerna::Vpn::ICON}
|
|
53
|
+
])
|
|
54
|
+
end
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
describe "#vpn_connected" do
|
|
58
|
+
it "should return the correct connected status" do
|
|
59
|
+
expect(subject).to receive(:execute_command).with("/usr/sbin/networksetup", "-showpppoestatus", "\"VPN\"").and_return("connected")
|
|
60
|
+
expect(subject.vpn_connected?("VPN")).to be_true
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
it "should return false for other status" do
|
|
64
|
+
expect(subject).to receive(:execute_command).with("/usr/sbin/networksetup", "-showpppoestatus", "\"VPN\"").and_return("other")
|
|
65
|
+
expect(subject.vpn_connected?("VPN")).to be_false
|
|
66
|
+
end
|
|
67
|
+
end
|
|
68
|
+
end
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
#
|
|
3
|
+
# This file is part of the pincerna gem. Copyright (C) 2013 and above Shogun <shogun@cowtech.it>.
|
|
4
|
+
# Licensed under the MIT license, which can be found at https://choosealicense.com/licenses/mit.
|
|
5
|
+
#
|
|
6
|
+
|
|
7
|
+
require "spec_helper"
|
|
8
|
+
|
|
9
|
+
describe Pincerna::Weather do
|
|
10
|
+
subject { Pincerna::Weather.new("QUERY", "yml") }
|
|
11
|
+
|
|
12
|
+
describe "matching" do
|
|
13
|
+
it "should match valid queries" do
|
|
14
|
+
allow_any_instance_of(Pincerna::Weather).to receive(:perform_filtering) { |*args| args }
|
|
15
|
+
allow_any_instance_of(Pincerna::Weather).to receive(:process_results) { |*args| args }
|
|
16
|
+
|
|
17
|
+
expect(Pincerna::Weather.new("Campobasso", "yml").filter).to eq_as_yaml([["Campobasso", "c"]])
|
|
18
|
+
expect(Pincerna::Weather.new("Campobasso in c", "yml").filter).to eq_as_yaml([["Campobasso", "c"]])
|
|
19
|
+
expect(Pincerna::Weather.new("Campobasso in F", "yml").filter).to eq_as_yaml([["Campobasso", "f"]])
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
describe "#perform_filtering", :vcr do
|
|
24
|
+
before(:each) do
|
|
25
|
+
allow(subject).to receive(:lookup_places).with("Campobasso") { |*args| [{woeid: 12345, name: "Campobasso, Molise, Italy"}] }
|
|
26
|
+
allow(subject).to receive(:get_forecast).with([{woeid: 12345, name: "Campobasso, Molise, Italy"}], "c") { |*args|
|
|
27
|
+
[{name: "Campobasso, Molise, Italy", image: "IMAGE", link: "LINK", current: {description: "TEXT", temperature: "29 C", wind: {speed: "29 kmh", direction: "W"}}, forecast: { description: "TEXT", high: "29 C", low: "13 C"}}]
|
|
28
|
+
}
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
it "should get forecast" do
|
|
32
|
+
expect(subject.perform_filtering("Campobasso", "c")).to eq([{name: "Campobasso, Molise, Italy", image: "IMAGE", link: "LINK", current: { description: "TEXT", temperature: "29 C", wind: {speed: "29 kmh", direction: "W"}}, forecast: { description: "TEXT", high: "29 C", low: "13 C"}}])
|
|
33
|
+
end
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
describe "#process_results" do
|
|
37
|
+
before(:each) do
|
|
38
|
+
@value = [{name: "Campobasso, Molise, Italy", image: "IMAGE", link: "LINK", current: { description: "CURRENT", temperature: "29 C", wind: {speed: "29 kmh", direction: "W"}}, forecast: { description: "NEXT", high: "29 C", low: "13 C"}}]
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
it "should correctly prepare results" do
|
|
42
|
+
expect(subject.process_results(@value)).to eq([{
|
|
43
|
+
title: "Campobasso, Molise, Italy", arg: "LINK",
|
|
44
|
+
subtitle: "29 C, Current, wind 29 kmh W - Next: 29 C / 13 C, NEXT",
|
|
45
|
+
icon: "IMAGE"
|
|
46
|
+
}])
|
|
47
|
+
end
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
describe "#lookup_places", :vcr, :synchronous do
|
|
51
|
+
before(:each) do
|
|
52
|
+
cache = Object.new
|
|
53
|
+
allow(cache).to receive(:use).and_yield
|
|
54
|
+
allow(Pincerna::Cache).to receive(:instance).and_return(cache)
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
it "should search for places" do
|
|
58
|
+
expect(subject.lookup_places("Campobasso")).to eq([{woeid: 711892, name: "Campobasso, Molise, Italy"}])
|
|
59
|
+
expect(subject.lookup_places("San Mateo")).to eq([{woeid: 2488142, name: "San Mateo, California, United States"}, {woeid: 2488139, name: "San Mateo, Putnam, Florida, United States"}, {woeid: 775977, name: "San Mateo, Sant Mateu, Castellon, Valencia, Spain"}, {woeid: 2488141, name: "San Mateo, Cibola, New Mexico, United States"}, {woeid: 2488150, name: "Jacksonville, Duval, Florida, United States"}])
|
|
60
|
+
expect(subject.lookup_places("asdfghjkl")).to eq([])
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
it "should return an existing WOEID without making any request" do
|
|
64
|
+
expect(subject.lookup_places("123")).to eq([{woeid: "123"}])
|
|
65
|
+
end
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
describe "#get_forecast", vcr: true do
|
|
69
|
+
before(:each) do
|
|
70
|
+
cache = Object.new
|
|
71
|
+
allow(cache).to receive(:use).and_yield
|
|
72
|
+
allow(Pincerna::Cache).to receive(:instance).and_return(cache)
|
|
73
|
+
|
|
74
|
+
@cache_dir = "/tmp/pincerna-weather"
|
|
75
|
+
subject.instance_variable_set("@cache_dir", @cache_dir)
|
|
76
|
+
FileUtils.rm_rf(@cache_dir)
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
after(:each) do
|
|
80
|
+
FileUtils.rm_rf(@cache_dir)
|
|
81
|
+
end
|
|
82
|
+
|
|
83
|
+
it "should get correct forecasts" do
|
|
84
|
+
expect(subject.get_forecast([{woeid: 711892, name: "Campobasso, Molise, Italy"}, {woeid: 2488142, name: "San Mateo, California, United States"}])).to eq([
|
|
85
|
+
{
|
|
86
|
+
woeid: 711892,
|
|
87
|
+
name: "Campobasso, Molise, Italy",
|
|
88
|
+
image: @cache_dir + "/weather/32.gif",
|
|
89
|
+
link: "http://us.rd.yahoo.com/dailynews/rss/weather/Campobasso__IT/*http://weather.yahoo.com/forecast/ITXX0112_c.html",
|
|
90
|
+
current: {description: "Sunny", temperature: "34 °C", wind: {speed: "1.61 km/h", direction: "W"}},
|
|
91
|
+
forecast: {description: "Thunderstorms Early", high: "31 °C", low: "23 °C"}
|
|
92
|
+
},
|
|
93
|
+
{
|
|
94
|
+
woeid: 2488142,
|
|
95
|
+
name: "San Mateo, California, United States",
|
|
96
|
+
image: @cache_dir + "/weather/26.gif",
|
|
97
|
+
link: "http://us.rd.yahoo.com/dailynews/rss/weather/San_Mateo__CA/*http://weather.yahoo.com/forecast/USCA1005_c.html",
|
|
98
|
+
current: {description: "Cloudy", temperature: "16 °C", wind: {speed: "9.66 km/h", direction: "W"}},
|
|
99
|
+
forecast: {description: "AM Clouds/PM Sun", high: "21 °C", low: "14 °C"},
|
|
100
|
+
}
|
|
101
|
+
])
|
|
102
|
+
end
|
|
103
|
+
|
|
104
|
+
it "should append name" do
|
|
105
|
+
expect(subject.get_forecast([{woeid: 2488139}])).to eq([{
|
|
106
|
+
woeid: 2488139,
|
|
107
|
+
name: "San Mateo, FL, United States",
|
|
108
|
+
image: @cache_dir + "/weather/30.gif",
|
|
109
|
+
link: "http://us.rd.yahoo.com/dailynews/rss/weather/San_Mateo__FL/*http://weather.yahoo.com/forecast/USFL0538_c.html",
|
|
110
|
+
current: {description: "Partly Cloudy", temperature: "31 °C", wind: {speed: "14.48 km/h", direction: "E"}},
|
|
111
|
+
forecast: {description: "Scattered Thunderstorms", high: "32 °C", low: "24 °C"}
|
|
112
|
+
}])
|
|
113
|
+
end
|
|
114
|
+
end
|
|
115
|
+
|
|
116
|
+
describe "#get_wind_direction" do
|
|
117
|
+
it "should correctly calculate directions" do
|
|
118
|
+
results = [
|
|
119
|
+
"N",
|
|
120
|
+
"N", "NE", "NE", "NE", "NE", "E", "E", "E", "E", # 90
|
|
121
|
+
"E", "SE", "SE", "SE", "SE", "S", "S", "S", "S", #180
|
|
122
|
+
"S", "SW", "SW", "SW", "SW", "W", "W", "W", "W", # 240
|
|
123
|
+
"W", "NW", "NW", "NW", "NW", "N", "N", "N", "N"
|
|
124
|
+
]
|
|
125
|
+
|
|
126
|
+
37.times do |deg|
|
|
127
|
+
expect(subject.get_wind_direction(deg * 10)).to eq(results[deg])
|
|
128
|
+
end
|
|
129
|
+
end
|
|
130
|
+
end
|
|
131
|
+
end
|