betforker 1.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/.gitignore +5 -0
- data/.rspec +2 -0
- data/.travis.yml +3 -0
- data/Gemfile +2 -0
- data/Gemfile.lock +90 -0
- data/README.md +53 -0
- data/Rakefile +12 -0
- data/betforker.gemspec +23 -0
- data/bin/betforker +64 -0
- data/config.yml +14 -0
- data/lib/betforker.rb +80 -0
- data/lib/betforker/bookmakers/__to_change__/betfair.rb +112 -0
- data/lib/betforker/bookmakers/__to_change__/parimatch.rb +137 -0
- data/lib/betforker/bookmakers/__to_change__/sbobet.rb +90 -0
- data/lib/betforker/bookmakers/__to_change__/winlinebet.rb +122 -0
- data/lib/betforker/bookmakers/marathon.rb +121 -0
- data/lib/betforker/bookmakers/williamhill.rb +115 -0
- data/lib/betforker/comparer.rb +176 -0
- data/lib/betforker/config.rb +201 -0
- data/lib/betforker/downloader.rb +128 -0
- data/lib/betforker/event.rb +74 -0
- data/lib/betforker/fork.rb +29 -0
- data/lib/betforker/names_winlinebet.rb +1092 -0
- data/lib/betforker/parsed_page.rb +13 -0
- data/lib/betforker/version.rb +3 -0
- data/spec/betforker_spec.rb +39 -0
- data/spec/bookmakers/__to_change__/betfair_test.rb +40 -0
- data/spec/bookmakers/__to_change__/parimatch_test.rb +41 -0
- data/spec/bookmakers/__to_change__/sbobet_test.rb +40 -0
- data/spec/bookmakers/__to_change__/winlinebet_test.rb +39 -0
- data/spec/bookmakers/marathon_spec.rb +84 -0
- data/spec/bookmakers/williamhill_spec.rb +81 -0
- data/spec/comparer_spec.rb +162 -0
- data/spec/config_spec.rb +155 -0
- data/spec/downloader_spec.rb +88 -0
- data/spec/event_spec.rb +94 -0
- data/spec/features/without_downloads_spec.rb +138 -0
- data/spec/fork_spec.rb +21 -0
- data/spec/spec_helper.rb +199 -0
- data/spec/support/html/betfair/betfair1.html +3453 -0
- data/spec/support/html/betfair/betfair2.html +3996 -0
- data/spec/support/html/betfair/betfair3.html +6566 -0
- data/spec/support/html/betfair/betfair4.html +3373 -0
- data/spec/support/html/betfair/bf_live.htm +5905 -0
- data/spec/support/html/fake/fake.html +15759 -0
- data/spec/support/html/marathon/first.html +2717 -0
- data/spec/support/html/marathon/live_page.html +7226 -0
- data/spec/support/html/marathon/second.html +3500 -0
- data/spec/support/html/marathon/with_forks.html +2525 -0
- data/spec/support/html/parimatch/parimatch1.html +588 -0
- data/spec/support/html/parimatch/parimatch2.html +589 -0
- data/spec/support/html/parimatch/parimatch3.html +581 -0
- data/spec/support/html/parimatch/parimatch4.html +641 -0
- data/spec/support/html/parimatch/pm_live.html +1049 -0
- data/spec/support/html/sbobet/sb1.htm +8 -0
- data/spec/support/html/sbobet/sb2.htm +8 -0
- data/spec/support/html/sbobet/sb3.htm +8 -0
- data/spec/support/html/sbobet/sb4.htm +8 -0
- data/spec/support/html/sbobet/sbobet_live.htm +8 -0
- data/spec/support/html/williamhill/first.html +13273 -0
- data/spec/support/html/williamhill/live_page.html +42735 -0
- data/spec/support/html/williamhill/second.html +15759 -0
- data/spec/support/html/williamhill/with_forks.html +13473 -0
- data/spec/support/html/williamhill/without_forks.html +14016 -0
- data/spec/support/html/winlinebet/win1.htm +23797 -0
- data/spec/support/html/winlinebet/win2.htm +23797 -0
- data/spec/support/html/winlinebet/win3.htm +23797 -0
- data/spec/support/html/winlinebet/win4.htm +23797 -0
- data/spec/support/html/winlinebet/win_live.htm +23815 -0
- metadata +211 -0
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
|
|
3
|
+
RSpec.describe Betforker do
|
|
4
|
+
let(:unstructured) { unstructured_events }
|
|
5
|
+
let(:structured) { structured_events }
|
|
6
|
+
$config = {}
|
|
7
|
+
|
|
8
|
+
describe '#build_events' do
|
|
9
|
+
let(:bookmakers) { ['First', 'Second'] }
|
|
10
|
+
let(:sport) { 'tennis' }
|
|
11
|
+
|
|
12
|
+
it 'successfully' do
|
|
13
|
+
allow(Betforker).to receive(:pull_live_events).
|
|
14
|
+
and_return(unstructured)
|
|
15
|
+
result = Betforker.build_events bookmakers, sport
|
|
16
|
+
|
|
17
|
+
expect(result.size).to eq 3
|
|
18
|
+
result.each do |e|
|
|
19
|
+
expect(e.class).to eq Event
|
|
20
|
+
expect(e.addresses.size).to be > 1
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
it 'with empty hash of events' do
|
|
25
|
+
allow(Betforker).to receive(:pull_live_events).
|
|
26
|
+
and_return({})
|
|
27
|
+
result = Betforker.build_events bookmakers, sport
|
|
28
|
+
expect(result.size).to eq 0
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
describe '#structure_events' do
|
|
33
|
+
it 'returns right hash' do
|
|
34
|
+
result = Betforker.structure_events unstructured
|
|
35
|
+
expect(result).to eq structured
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
require_relative 'test_helper'
|
|
2
|
+
|
|
3
|
+
class BetfairTest < Minitest::Test
|
|
4
|
+
|
|
5
|
+
def setup
|
|
6
|
+
@bf = Betfair.new
|
|
7
|
+
@html_folder = 'test/html/betfair/'
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
def test_betfair_live_page_parsing
|
|
11
|
+
html = open("#{@html_folder}bf_live.htm").read
|
|
12
|
+
result = @bf.live_page_parsed(html)
|
|
13
|
+
assert_equal Hash, result.class
|
|
14
|
+
assert_equal 6, result.size
|
|
15
|
+
result.each do |addr, who|
|
|
16
|
+
assert addr.include?('www.betfair.com')
|
|
17
|
+
assert_equal String, addr.class
|
|
18
|
+
assert_equal String, who.class
|
|
19
|
+
end
|
|
20
|
+
# result.each {|k,r| puts k; puts r}
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
def test_betfair_event_parsing
|
|
24
|
+
events = []
|
|
25
|
+
(1..4).each do |num|
|
|
26
|
+
events << "#{@html_folder}betfair#{num}.html"
|
|
27
|
+
end
|
|
28
|
+
events.each do |event_page|
|
|
29
|
+
@bf = Betfair.new
|
|
30
|
+
res = @bf.event_parsed(open(event_page).read)
|
|
31
|
+
# p res
|
|
32
|
+
assert_equal(String, res[:home_player][:name].class)
|
|
33
|
+
assert_equal(String, res[:away_player][:name].class)
|
|
34
|
+
assert_equal(Hash, res[:home_player].class)
|
|
35
|
+
assert_equal(Hash, res[:away_player].class)
|
|
36
|
+
assert_equal(String, res[:score].class)
|
|
37
|
+
assert_equal('Betfair', res[:bookie])
|
|
38
|
+
end
|
|
39
|
+
end
|
|
40
|
+
end
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
require_relative 'test_helper'
|
|
2
|
+
|
|
3
|
+
class ParimatchTest < Minitest::Test
|
|
4
|
+
|
|
5
|
+
def setup
|
|
6
|
+
@pm = Parimatch.new
|
|
7
|
+
@html_folder = 'test/html/parimatch/'
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
def test_parimatch_live_page_parsing
|
|
11
|
+
html = open("#{@html_folder}pm_live.html").read
|
|
12
|
+
result = @pm.live_page_parsed(html)
|
|
13
|
+
assert_equal Hash, result.class
|
|
14
|
+
assert_equal 16, result.size
|
|
15
|
+
result.each do |addr, who|
|
|
16
|
+
assert addr.include?('parimatch.com')
|
|
17
|
+
assert_equal String, addr.class
|
|
18
|
+
assert_equal String, who.class
|
|
19
|
+
end
|
|
20
|
+
# result.each {|k,r| puts k; puts r}
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
def test_parimatch_event_parsing
|
|
24
|
+
events = []
|
|
25
|
+
(1..4).each do |num|
|
|
26
|
+
events << "#{@html_folder}parimatch#{num}.html"
|
|
27
|
+
end
|
|
28
|
+
events.each do |event_page|
|
|
29
|
+
@pm = Parimatch.new
|
|
30
|
+
res = @pm.event_parsed(open(event_page).read)
|
|
31
|
+
# p res
|
|
32
|
+
assert_equal(String, res[:home_player][:name].class)
|
|
33
|
+
assert_equal(String, res[:away_player][:name].class)
|
|
34
|
+
assert_equal(Hash, res[:home_player].class)
|
|
35
|
+
assert_equal(Hash, res[:away_player].class)
|
|
36
|
+
assert_equal(String, res[:score].class)
|
|
37
|
+
assert_equal('Parimatch', res[:bookie])
|
|
38
|
+
end
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
end
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
require_relative 'test_helper'
|
|
2
|
+
|
|
3
|
+
class SbobetTest < Minitest::Test
|
|
4
|
+
|
|
5
|
+
def setup
|
|
6
|
+
@sb = Sbobet.new
|
|
7
|
+
@html_folder = 'test/html/sbobet/'
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
def test_sbobet_live_page_parsing
|
|
11
|
+
html = open("#{@html_folder}sbobet_live.htm").read
|
|
12
|
+
result = @sb.live_page_parsed(html)
|
|
13
|
+
assert_equal Hash, result.class
|
|
14
|
+
assert_equal 8, result.size
|
|
15
|
+
result.each do |addr, who|
|
|
16
|
+
assert addr.include?('sbobet')
|
|
17
|
+
assert_equal String, addr.class
|
|
18
|
+
assert_equal String, who.class
|
|
19
|
+
end
|
|
20
|
+
# result.each {|k,r| puts k; puts r}
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
def test_sbobet_event_parsing
|
|
24
|
+
events = []
|
|
25
|
+
(1..4).each do |num|
|
|
26
|
+
events << "#{@html_folder}sb#{num}.htm"
|
|
27
|
+
end
|
|
28
|
+
events.each do |event_page|
|
|
29
|
+
@sb = Sbobet.new
|
|
30
|
+
res = @sb.event_parsed(open(event_page).read)
|
|
31
|
+
# p res
|
|
32
|
+
assert_equal(String, res[:home_player][:name].class)
|
|
33
|
+
assert_equal(String, res[:away_player][:name].class)
|
|
34
|
+
assert_equal(Hash, res[:home_player].class)
|
|
35
|
+
assert_equal(Hash, res[:away_player].class)
|
|
36
|
+
assert_equal(String, res[:score].class)
|
|
37
|
+
assert_equal('Sbobet', res[:bookie])
|
|
38
|
+
end
|
|
39
|
+
end
|
|
40
|
+
end
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
require_relative 'test_helper'
|
|
2
|
+
|
|
3
|
+
class WinlinebetTest < Minitest::Test
|
|
4
|
+
|
|
5
|
+
def setup
|
|
6
|
+
@win = Winlinebet.new
|
|
7
|
+
@html_folder = 'test/html/winlinebet/'
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
def test_winline_live_page_parsing
|
|
11
|
+
html = open("#{@html_folder}win_live.htm").read
|
|
12
|
+
result = @win.live_page_parsed(html)
|
|
13
|
+
assert_equal Hash, result.class
|
|
14
|
+
result.each do |addr, who|
|
|
15
|
+
assert addr.include?('winlinebet')
|
|
16
|
+
assert_equal String, addr.class
|
|
17
|
+
assert_equal String, who.class
|
|
18
|
+
end
|
|
19
|
+
# result.each {|k,r| puts k; puts r}
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
def test_winline_event_parsing
|
|
23
|
+
events = []
|
|
24
|
+
(1..4).each do |num|
|
|
25
|
+
events << "#{@html_folder}win#{num}.htm"
|
|
26
|
+
end
|
|
27
|
+
events.each do |event_page|
|
|
28
|
+
@win = Winlinebet.new
|
|
29
|
+
res = @win.event_parsed(open(event_page).read)
|
|
30
|
+
# p res
|
|
31
|
+
assert_equal(String, res[:home_player][:name].class)
|
|
32
|
+
assert_equal(String, res[:away_player][:name].class)
|
|
33
|
+
assert_equal(Hash, res[:home_player].class)
|
|
34
|
+
assert_equal(Hash, res[:away_player].class)
|
|
35
|
+
assert_equal(String, res[:score].class)
|
|
36
|
+
assert_equal('Winlinebet', res[:bookie])
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
end
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
|
|
3
|
+
RSpec.describe Betforker::Bookmakers::Marathon do
|
|
4
|
+
describe '#parse_live_page' do
|
|
5
|
+
let(:sport) { 'tennis' }
|
|
6
|
+
let(:result) { Marathon.parse_live_page(webpage, sport) }
|
|
7
|
+
|
|
8
|
+
context 'tennis successfully' do
|
|
9
|
+
let(:webpage) { open_right_live_page 'marathon' }
|
|
10
|
+
|
|
11
|
+
specify { expect(result.instance_of?(Hash)).to be true }
|
|
12
|
+
specify { expect(result.size).not_to eq 0 }
|
|
13
|
+
|
|
14
|
+
it "every hash key contains address" do
|
|
15
|
+
result.keys.each do |key|
|
|
16
|
+
expect(key).to include Betforker::MARATHON_BASE
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
context 'tennis with no events' do
|
|
22
|
+
let(:webpage) { marathon_live_page_without_events }
|
|
23
|
+
specify { expect(result.size).to eq 0 }
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
context 'tennis with wrong webpage' do
|
|
27
|
+
let(:webpage) { open_right_live_page 'williamhill' }
|
|
28
|
+
specify { expect(result.size).to eq 0 }
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
describe '#parse_event' do
|
|
33
|
+
let(:sport) { 'tennis' }
|
|
34
|
+
let(:result) do
|
|
35
|
+
event = Event.new [1,2,3], sport
|
|
36
|
+
event.webpages.merge!({ 'marathon' => webpage })
|
|
37
|
+
Marathon.parse_event(event, sport)
|
|
38
|
+
event.parsed_webpages.first
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
context 'tennis C.Cianci/P.Martins vs B.Luz/J.Vale Costa' do
|
|
42
|
+
let(:webpage) { open_event_page('marathon', 'first.html') }
|
|
43
|
+
it 'all must be good' do
|
|
44
|
+
expect(result.home_player[:name]).to eq 'CianciMartins'
|
|
45
|
+
expect(result.away_player[:name]).to eq 'CostaLuz'
|
|
46
|
+
expect(result.home_player[:match]).to eq 3.05
|
|
47
|
+
expect(result.away_player[:match]).to eq 1.37
|
|
48
|
+
expect(result.score).to eq '30:0 (1:0)'
|
|
49
|
+
expect(result.home_player[:set]['1']).to eq 2.14
|
|
50
|
+
expect(result.away_player[:set]['1']).to eq 1.70
|
|
51
|
+
expect(result.home_player[:game]['3']).to eq 3.00
|
|
52
|
+
expect(result.away_player[:game]['3']).to eq 1.38
|
|
53
|
+
end
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
context 'tennis Melzer vs Skugor' do
|
|
57
|
+
let(:webpage) { open_event_page('marathon', 'second.html') }
|
|
58
|
+
it 'all must be good' do
|
|
59
|
+
expect(result.home_player[:name]).to eq 'Melzer'
|
|
60
|
+
expect(result.away_player[:name]).to eq 'Skugor'
|
|
61
|
+
expect(result.home_player[:match]).to eq 1.89
|
|
62
|
+
expect(result.away_player[:match]).to eq 1.909
|
|
63
|
+
expect(result.home_player[:set]['2']).to eq 7.20
|
|
64
|
+
expect(result.away_player[:set]['2']).to eq 1.095
|
|
65
|
+
expect(result.home_player[:game]['7']).to eq 4.40
|
|
66
|
+
expect(result.away_player[:game]['7']).to eq 1.21
|
|
67
|
+
end
|
|
68
|
+
end
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
describe '#concatenated_names' do
|
|
72
|
+
let(:result) { Marathon.concatenated_names(names) }
|
|
73
|
+
|
|
74
|
+
context 'First, Player v Second, Player' do
|
|
75
|
+
let(:names) { 'First, Player v Second, Player' }
|
|
76
|
+
specify { expect(result).to eq 'FirstSecond' }
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
context 'R.Klaasen / R.Ram v O.Marach / F.Martin' do
|
|
80
|
+
let(:names) { 'R.Klaasen / R.Ram v O.Marach / F.Martin' }
|
|
81
|
+
specify { expect(result).to eq 'KlaasenMarachMartinRam' }
|
|
82
|
+
end
|
|
83
|
+
end
|
|
84
|
+
end
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
|
|
3
|
+
RSpec.describe Betforker::Bookmakers::WilliamHill do
|
|
4
|
+
describe '#parse_live_page' do
|
|
5
|
+
let(:sport) { 'tennis' }
|
|
6
|
+
let(:result) { WilliamHill.parse_live_page(webpage, sport) }
|
|
7
|
+
|
|
8
|
+
context 'tennis successfully' do
|
|
9
|
+
let(:webpage) { open_right_live_page 'williamhill' }
|
|
10
|
+
|
|
11
|
+
specify { expect(result.instance_of?(Hash)).to be true }
|
|
12
|
+
specify { expect(result.size).not_to eq 0 }
|
|
13
|
+
|
|
14
|
+
it "every hash key contains address" do
|
|
15
|
+
result.keys.each do |key|
|
|
16
|
+
expect(key).to include Betforker::WILLIAMHILL_BASE
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
context 'tennis with no events' do
|
|
22
|
+
let(:webpage) { williamhill_live_page_without_events }
|
|
23
|
+
specify { expect(result.size).to eq 0 }
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
context 'tennis with wrong webpage' do
|
|
27
|
+
let(:webpage) { open_right_live_page 'marathon' }
|
|
28
|
+
specify { expect(result.size).to eq 0 }
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
describe '#parse_event' do
|
|
33
|
+
let(:sport) { 'tennis' }
|
|
34
|
+
let(:result) do
|
|
35
|
+
event = Event.new [1,2,3], sport
|
|
36
|
+
event.webpages.merge!({ 'williamhill' => webpage })
|
|
37
|
+
WilliamHill.parse_event(event, sport)
|
|
38
|
+
event.parsed_webpages.first
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
context 'tennis Motti/Peng vs Donati/Sonego' do
|
|
42
|
+
let(:webpage) { open_event_page('williamhill', 'first.html') }
|
|
43
|
+
it 'all must be good' do
|
|
44
|
+
expect(result.home_player[:name]).to eq 'MottiPeng'
|
|
45
|
+
expect(result.away_player[:name]).to eq 'DonatiSonego'
|
|
46
|
+
expect(result.home_player[:match]).to eq 3.75
|
|
47
|
+
expect(result.away_player[:match]).to eq 1.25
|
|
48
|
+
expect(result.home_player[:game]['4']).to eq 4.00
|
|
49
|
+
expect(result.away_player[:game]['4']).to eq 1.22
|
|
50
|
+
end
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
context 'tennis Schmiedlova vs Argyelan' do
|
|
54
|
+
let(:webpage) { open_event_page('williamhill', 'second.html') }
|
|
55
|
+
it 'all must be good' do
|
|
56
|
+
expect(result.home_player[:name]).to eq 'Schmiedlova'
|
|
57
|
+
expect(result.away_player[:name]).to eq 'Argyelan'
|
|
58
|
+
expect(result.home_player[:match]).to eq 1.73
|
|
59
|
+
expect(result.away_player[:match]).to eq 2.00
|
|
60
|
+
expect(result.home_player[:game]['1']).to eq 2.00
|
|
61
|
+
expect(result.away_player[:game]['1']).to eq 1.73
|
|
62
|
+
expect(result.home_player[:game]['2']).to eq 1.40
|
|
63
|
+
expect(result.away_player[:game]['2']).to eq 2.75
|
|
64
|
+
end
|
|
65
|
+
end
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
describe '#concatenated_names' do
|
|
69
|
+
let(:result) { WilliamHill.concatenated_names(names) }
|
|
70
|
+
|
|
71
|
+
context 'Luna Meers v Steffii Distelmans' do
|
|
72
|
+
let(:names) { 'Luna Meers v Steffii Distelmans' }
|
|
73
|
+
specify { expect(result).to eq 'DistelmansMeers' }
|
|
74
|
+
end
|
|
75
|
+
|
|
76
|
+
context 'Oleksandr Bielinsky/Michail Fufygin v Vitaly Kozyukov/Aleksander Ovcharov' do
|
|
77
|
+
let(:names) { 'Oleksandr Bielinsky/Aleksander Ovcharov v Vitaly Kozyukov/Michail Fufygin' }
|
|
78
|
+
specify { expect(result).to eq 'BielinskyFufyginKozyukovOvcharov' }
|
|
79
|
+
end
|
|
80
|
+
end
|
|
81
|
+
end
|
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
|
|
3
|
+
RSpec.describe Betforker::Comparer do
|
|
4
|
+
before do
|
|
5
|
+
$config = { min_percent: 1.1, filtering: true }
|
|
6
|
+
end
|
|
7
|
+
|
|
8
|
+
describe '#compare' do
|
|
9
|
+
let(:first) do
|
|
10
|
+
parsed = ParsedPage.new bookie: 'WilliamHill'
|
|
11
|
+
parsed.score = ''
|
|
12
|
+
parsed.home_player =
|
|
13
|
+
{ name: 'Home_Player', match: 1.6, game: {'5' => 2.2 }, set: {'1' => 1.4 } }
|
|
14
|
+
parsed.away_player =
|
|
15
|
+
{ name: 'Away_Player', match: 2.3, game: {'5' => 1.7 }, set: {'1' => 2.9 } }
|
|
16
|
+
parsed
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
let(:second) do
|
|
20
|
+
parsed = ParsedPage.new bookie: 'Betfair'
|
|
21
|
+
parsed.score = '0:0 (2:1)'
|
|
22
|
+
parsed.home_player =
|
|
23
|
+
{ name: 'Home_Player', match: 1.3, game: {'5' => 2.9 }, set: {'1' => 1.6 } }
|
|
24
|
+
parsed.away_player =
|
|
25
|
+
{ name: 'Away_Player', match: 3.3, game: {'5' => 1.4 }, set: {'1' => 2.2 } }
|
|
26
|
+
parsed
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
it 'find forks' do
|
|
30
|
+
forks = Comparer.compare first, second
|
|
31
|
+
expect(forks).not_to be_empty
|
|
32
|
+
forks.each do |f|
|
|
33
|
+
expect(f.class).to eq Fork
|
|
34
|
+
expect(f.bookmakers).to eq 'WilliamHill - Betfair'
|
|
35
|
+
expect(f.players).to eq 'Away_Player VS Home_Player'
|
|
36
|
+
expect(f.score).to eq '0:0 (2:1)'
|
|
37
|
+
expect(f.what).to match /match|game5|set1/
|
|
38
|
+
end
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
it 'find only one fork(game)' do
|
|
42
|
+
scores = ['15:0 (2:1)', '30:0 (0:3)', '0:0 (0:2)', '0:0 (1:1)']
|
|
43
|
+
scores.each do |s|
|
|
44
|
+
second.score = s
|
|
45
|
+
forks = Comparer.compare first, second
|
|
46
|
+
expect(forks).not_to be_empty
|
|
47
|
+
expect(forks.size).to eq 1
|
|
48
|
+
expect(forks[0].what).to eq 'game5'
|
|
49
|
+
end
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
it 'find if it is break' do
|
|
53
|
+
scores = ['0:0 (0:0)', '0:0 (2:3)', '0:0 (6:2)', '0:0 (5:7)']
|
|
54
|
+
scores.each do |s|
|
|
55
|
+
second.score = s
|
|
56
|
+
second.home_player[:game]['5'] = 2.2
|
|
57
|
+
forks = Comparer.compare first, second
|
|
58
|
+
expect(forks).not_to be_empty
|
|
59
|
+
expect(forks.size).to eq 2
|
|
60
|
+
forks.each do |f|
|
|
61
|
+
expect(f.what).to match /match|set1/
|
|
62
|
+
end
|
|
63
|
+
end
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
it 'do not find forks' do
|
|
67
|
+
other_second = second.dup
|
|
68
|
+
other_second.home_player = second.away_player
|
|
69
|
+
forks = Comparer.compare first, other_second
|
|
70
|
+
expect(forks).to be_empty
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
it 'do not find when not break' do
|
|
74
|
+
scores = ['0:0 (2:2)', '15:30 (2:3)', '0:0 (6:6)']
|
|
75
|
+
scores.each do |s|
|
|
76
|
+
second.score = s
|
|
77
|
+
forks = Comparer.compare first, second
|
|
78
|
+
expect(forks).to be_empty
|
|
79
|
+
end
|
|
80
|
+
end
|
|
81
|
+
end
|
|
82
|
+
|
|
83
|
+
describe '#check_sorting' do
|
|
84
|
+
let(:homeplayer) { 'Aaaa' }
|
|
85
|
+
let(:awayplayer) { 'Zzzz' }
|
|
86
|
+
let(:first) do
|
|
87
|
+
parsed = ParsedPage.new bookie: 'First'
|
|
88
|
+
parsed.home_player[:name] = homeplayer
|
|
89
|
+
parsed.away_player[:name] = awayplayer
|
|
90
|
+
parsed
|
|
91
|
+
end
|
|
92
|
+
let(:second) do
|
|
93
|
+
parsed = ParsedPage.new bookie: 'Second'
|
|
94
|
+
parsed.home_player[:name] = homeplayer
|
|
95
|
+
parsed.away_player[:name] = awayplayer
|
|
96
|
+
parsed
|
|
97
|
+
end
|
|
98
|
+
|
|
99
|
+
it 'will not change anything' do
|
|
100
|
+
Comparer.check_sorting first, second
|
|
101
|
+
|
|
102
|
+
expect(first.home_player[:name]).to eq homeplayer
|
|
103
|
+
expect(first.away_player[:name]).to eq awayplayer
|
|
104
|
+
expect(second.home_player[:name]).to eq homeplayer
|
|
105
|
+
expect(second.away_player[:name]).to eq awayplayer
|
|
106
|
+
end
|
|
107
|
+
|
|
108
|
+
it 'will change players' do
|
|
109
|
+
Comparer.change_names(first)
|
|
110
|
+
expect(first.home_player[:name]).to_not eq homeplayer
|
|
111
|
+
expect(first.away_player[:name]).to_not eq awayplayer
|
|
112
|
+
expect(second.home_player[:name]).to eq homeplayer
|
|
113
|
+
expect(second.away_player[:name]).to eq awayplayer
|
|
114
|
+
Comparer.check_sorting first, second
|
|
115
|
+
expect(first.home_player[:name]).to eq homeplayer
|
|
116
|
+
expect(first.away_player[:name]).to eq awayplayer
|
|
117
|
+
expect(second.home_player[:name]).to eq homeplayer
|
|
118
|
+
expect(second.away_player[:name]).to eq awayplayer
|
|
119
|
+
end
|
|
120
|
+
end
|
|
121
|
+
|
|
122
|
+
describe '#calculate' do
|
|
123
|
+
it 'when it is a fork' do
|
|
124
|
+
x, y = 1.5, 4.0
|
|
125
|
+
percent = Comparer.calculate x, y
|
|
126
|
+
expect(percent).to be > 2.0
|
|
127
|
+
end
|
|
128
|
+
|
|
129
|
+
it 'when it is a fork(reverted x and y)' do
|
|
130
|
+
x, y = 4.0, 1.5
|
|
131
|
+
percent = Comparer.calculate x, y
|
|
132
|
+
expect(percent).to be > 2.0
|
|
133
|
+
end
|
|
134
|
+
|
|
135
|
+
it 'when it is not a fork' do
|
|
136
|
+
x, y = 1.2, 4.0
|
|
137
|
+
percent = Comparer.calculate x, y
|
|
138
|
+
expect(percent).to be < 2.0
|
|
139
|
+
end
|
|
140
|
+
|
|
141
|
+
it 'when x or y are 0' do
|
|
142
|
+
x, y = 0.0, 0.0
|
|
143
|
+
percent = Comparer.calculate x, y
|
|
144
|
+
expect(percent).to be == -3.5
|
|
145
|
+
end
|
|
146
|
+
end
|
|
147
|
+
|
|
148
|
+
describe '#is_a_break?' do
|
|
149
|
+
it 'when a break' do
|
|
150
|
+
['0:0 (2:3)', '0:0 (5:2)', '0:0 (0:0)'].each do |score|
|
|
151
|
+
state = Comparer.is_a_break? score
|
|
152
|
+
expect(state).to be_truthy
|
|
153
|
+
end
|
|
154
|
+
end
|
|
155
|
+
it 'when not a break' do
|
|
156
|
+
['0:0 (4:4)', '0:0 (6:6)', '30:15 (0:1)'].each do |score|
|
|
157
|
+
state = Comparer.is_a_break? score
|
|
158
|
+
expect(state).to be_falsey
|
|
159
|
+
end
|
|
160
|
+
end
|
|
161
|
+
end
|
|
162
|
+
end
|