zold 0.0.8 → 0.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.github/ISSUE_TEMPLATE.md +12 -0
- data/.github/PULL_REQUEST_TEMPLATE.md +11 -0
- data/.rubocop.yml +9 -1
- data/.simplecov +2 -2
- data/.travis.yml +1 -1
- data/Gemfile +1 -1
- data/LICENSE.txt +1 -1
- data/Procfile +1 -1
- data/README.md +208 -101
- data/Rakefile +2 -1
- data/bin/zold +135 -54
- data/features/cli.feature +1 -1
- data/features/step_definitions/steps.rb +1 -1
- data/features/support/env.rb +1 -1
- data/fixtures/scripts/push-and-pull.sh +35 -0
- data/lib/zold.rb +2 -2
- data/lib/zold/amount.rb +10 -2
- data/lib/zold/commands/{send.rb → clean.rb} +16 -16
- data/lib/zold/commands/create.rb +7 -5
- data/lib/zold/commands/diff.rb +59 -0
- data/lib/zold/commands/fetch.rb +74 -0
- data/lib/zold/commands/{pull.rb → list.rb} +11 -17
- data/lib/zold/commands/merge.rb +50 -0
- data/lib/zold/commands/node.rb +94 -0
- data/lib/zold/commands/pay.rb +58 -0
- data/lib/zold/commands/{check.rb → propagate.rb} +19 -20
- data/lib/zold/commands/push.rb +12 -12
- data/lib/zold/commands/remote.rb +115 -0
- data/lib/zold/commands/{balance.rb → show.rb} +11 -7
- data/lib/zold/copies.rb +126 -0
- data/lib/zold/http.rb +70 -0
- data/lib/zold/id.rb +8 -3
- data/lib/zold/key.rb +2 -2
- data/lib/zold/log.rb +51 -2
- data/lib/zold/node/farm.rb +81 -0
- data/lib/zold/node/front.rb +94 -46
- data/lib/zold/patch.rb +58 -0
- data/lib/zold/remotes.rb +106 -0
- data/lib/zold/score.rb +101 -0
- data/lib/zold/signature.rb +48 -0
- data/lib/zold/version.rb +3 -3
- data/lib/zold/wallet.rb +87 -55
- data/lib/zold/wallets.rb +13 -6
- data/resources/remotes +1 -0
- data/test/commands/test_clean.rb +41 -0
- data/test/commands/test_create.rb +2 -2
- data/test/commands/test_diff.rb +61 -0
- data/test/commands/test_fetch.rb +65 -0
- data/test/commands/test_list.rb +42 -0
- data/test/commands/test_merge.rb +62 -0
- data/test/commands/test_node.rb +56 -0
- data/test/commands/{test_send.rb → test_pay.rb} +10 -11
- data/test/commands/test_remote.rb +60 -0
- data/test/commands/{test_balance.rb → test_show.rb} +6 -8
- data/test/node/fake_node.rb +73 -0
- data/test/node/test_farm.rb +34 -0
- data/test/node/test_front.rb +26 -57
- data/test/test__helper.rb +1 -1
- data/test/test_amount.rb +10 -2
- data/test/test_copies.rb +73 -0
- data/test/test_http.rb +42 -0
- data/test/test_id.rb +2 -2
- data/test/test_key.rb +10 -10
- data/test/test_patch.rb +59 -0
- data/test/test_remotes.rb +72 -0
- data/test/test_score.rb +79 -0
- data/test/test_signature.rb +45 -0
- data/test/test_wallet.rb +18 -35
- data/test/test_wallets.rb +14 -3
- data/test/test_zold.rb +52 -5
- data/zold.gemspec +5 -3
- metadata +92 -21
- data/CONTRIBUTING.md +0 -19
- data/views/index.haml +0 -6
- data/views/layout.haml +0 -26
- data/views/not_found.haml +0 -3
@@ -0,0 +1,48 @@
|
|
1
|
+
# Copyright (c) 2018 Yegor Bugayenko
|
2
|
+
#
|
3
|
+
# Permission is hereby granted, free of charge, to any person obtaining a copy
|
4
|
+
# of this software and associated documentation files (the 'Software'), to deal
|
5
|
+
# in the Software without restriction, including without limitation the rights
|
6
|
+
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
7
|
+
# copies of the Software, and to permit persons to whom the Software is
|
8
|
+
# furnished to do so, subject to the following conditions:
|
9
|
+
#
|
10
|
+
# The above copyright notice and this permission notice shall be included in all
|
11
|
+
# copies or substantial portions of the Software.
|
12
|
+
#
|
13
|
+
# THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
14
|
+
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
15
|
+
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFINGEMENT. IN NO EVENT SHALL THE
|
16
|
+
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
17
|
+
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
18
|
+
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
19
|
+
# SOFTWARE.
|
20
|
+
|
21
|
+
require 'time'
|
22
|
+
require_relative 'key.rb'
|
23
|
+
require_relative 'id.rb'
|
24
|
+
require_relative 'amount.rb'
|
25
|
+
|
26
|
+
# The signature of a transaction.
|
27
|
+
#
|
28
|
+
# Author:: Yegor Bugayenko (yegor256@gmail.com)
|
29
|
+
# Copyright:: Copyright (c) 2018 Yegor Bugayenko
|
30
|
+
# License:: MIT
|
31
|
+
module Zold
|
32
|
+
# A signature
|
33
|
+
class Signature
|
34
|
+
def sign(pvt, txn)
|
35
|
+
pvt.sign(block(txn))
|
36
|
+
end
|
37
|
+
|
38
|
+
def valid?(pub, txn)
|
39
|
+
pub.verify(txn[:sign], block(txn))
|
40
|
+
end
|
41
|
+
|
42
|
+
private
|
43
|
+
|
44
|
+
def block(txn)
|
45
|
+
"#{txn[:id]};#{txn[:amount].to_i};#{txn[:bnf]};#{txn[:details]}"
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
data/lib/zold/version.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
# Copyright (c) 2018
|
1
|
+
# Copyright (c) 2018 Yegor Bugayenko
|
2
2
|
#
|
3
3
|
# Permission is hereby granted, free of charge, to any person obtaining a copy
|
4
4
|
# of this software and associated documentation files (the 'Software'), to deal
|
@@ -20,8 +20,8 @@
|
|
20
20
|
|
21
21
|
# Zold main module.
|
22
22
|
# Author:: Yegor Bugayenko (yegor256@gmail.com)
|
23
|
-
# Copyright:: Copyright (c) 2018
|
23
|
+
# Copyright:: Copyright (c) 2018 Yegor Bugayenko
|
24
24
|
# License:: MIT
|
25
25
|
module Zold
|
26
|
-
VERSION = '0.
|
26
|
+
VERSION = '0.1'.freeze
|
27
27
|
end
|
data/lib/zold/wallet.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
# Copyright (c) 2018
|
1
|
+
# Copyright (c) 2018 Yegor Bugayenko
|
2
2
|
#
|
3
3
|
# Permission is hereby granted, free of charge, to any person obtaining a copy
|
4
4
|
# of this software and associated documentation files (the 'Software'), to deal
|
@@ -19,10 +19,19 @@
|
|
19
19
|
# SOFTWARE.
|
20
20
|
|
21
21
|
require 'time'
|
22
|
+
require_relative 'key.rb'
|
23
|
+
require_relative 'id.rb'
|
24
|
+
require_relative 'amount.rb'
|
25
|
+
require_relative 'signature.rb'
|
22
26
|
|
23
27
|
# The wallet.
|
28
|
+
#
|
29
|
+
# It is a text file with a name equal to the wallet ID, which is
|
30
|
+
# a hexadecimal number of 16 digits, for example: "0123456789abcdef".
|
31
|
+
# More details about its format is in README.md.
|
32
|
+
#
|
24
33
|
# Author:: Yegor Bugayenko (yegor256@gmail.com)
|
25
|
-
# Copyright:: Copyright (c) 2018
|
34
|
+
# Copyright:: Copyright (c) 2018 Yegor Bugayenko
|
26
35
|
# License:: MIT
|
27
36
|
module Zold
|
28
37
|
# A single wallet
|
@@ -31,6 +40,10 @@ module Zold
|
|
31
40
|
@file = file
|
32
41
|
end
|
33
42
|
|
43
|
+
def ==(other)
|
44
|
+
to_s == other.to_s
|
45
|
+
end
|
46
|
+
|
34
47
|
def to_s
|
35
48
|
id.to_s
|
36
49
|
end
|
@@ -43,16 +56,11 @@ module Zold
|
|
43
56
|
@file
|
44
57
|
end
|
45
58
|
|
46
|
-
def init(id, pubkey)
|
47
|
-
raise "File '#{@file}' already exists" if File.exist?(@file)
|
59
|
+
def init(id, pubkey, overwrite: false)
|
60
|
+
raise "File '#{@file}' already exists" if File.exist?(@file) && !overwrite
|
48
61
|
File.write(@file, "#{id}\n#{pubkey.to_pub}\n\n")
|
49
62
|
end
|
50
63
|
|
51
|
-
def version
|
52
|
-
all = txns
|
53
|
-
all.empty? ? 0 : all.map { |t| t[0] }.map(&:to_i).max
|
54
|
-
end
|
55
|
-
|
56
64
|
def root?
|
57
65
|
id == Id::ROOT
|
58
66
|
end
|
@@ -62,68 +70,92 @@ module Zold
|
|
62
70
|
end
|
63
71
|
|
64
72
|
def balance
|
65
|
-
|
66
|
-
coins: txns.map { |t| t[2] }.map(&:to_i).inject(0) { |sum, n| sum + n }
|
67
|
-
)
|
73
|
+
txns.inject(Amount::ZERO) { |sum, t| sum + t[:amount] }
|
68
74
|
end
|
69
75
|
|
70
|
-
def sub(amount, target, pvtkey)
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
target,
|
78
|
-
pvtkey.sign("#{txn};#{amount.to_i};#{target}")
|
79
|
-
].join(';') + "\n"
|
80
|
-
File.write(@file, (lines << line).join(''))
|
81
|
-
{
|
82
|
-
id: txn,
|
83
|
-
date: date,
|
84
|
-
amount: amount,
|
85
|
-
beneficiary: id
|
76
|
+
def sub(amount, target, pvtkey, details = '-')
|
77
|
+
txn = {
|
78
|
+
id: max + 1,
|
79
|
+
date: Time.now,
|
80
|
+
amount: amount.mul(-1),
|
81
|
+
bnf: target,
|
82
|
+
details: details
|
86
83
|
}
|
84
|
+
txn[:sign] = Signature.new.sign(pvtkey, txn)
|
85
|
+
File.write(@file, (lines << to_line(txn)).join)
|
86
|
+
txn[:amount] = amount
|
87
|
+
txn
|
87
88
|
end
|
88
89
|
|
89
90
|
def add(txn)
|
90
|
-
|
91
|
-
"/#{txn[:id]}",
|
92
|
-
txn[:date].iso8601,
|
93
|
-
txn[:amount].to_i,
|
94
|
-
txn[:beneficiary]
|
95
|
-
].join(';') + "\n"
|
96
|
-
File.write(@file, (lines << line).join(''))
|
91
|
+
open(@file, 'a') { |f| f.print to_line(txn) }
|
97
92
|
end
|
98
93
|
|
99
|
-
def
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
raise "#{xbeneficiary} != #{beneficiary}" if xbeneficiary != beneficiary
|
106
|
-
data = "#{id};#{amount.to_i};#{beneficiary}"
|
107
|
-
valid = Key.new(text: lines[1].strip).verify(txn[4], data)
|
108
|
-
raise "Signature is not confirming this data: '#{data}'" unless valid
|
109
|
-
true
|
94
|
+
def has?(id, bnf)
|
95
|
+
!txns.find { |t| t[:id] == id && t[:bnf] == bnf }.nil?
|
96
|
+
end
|
97
|
+
|
98
|
+
def key
|
99
|
+
Key.new(text: lines[1].strip)
|
110
100
|
end
|
111
101
|
|
112
102
|
def income
|
113
|
-
txns.
|
114
|
-
|
115
|
-
id: t[0][1..-1].to_i,
|
116
|
-
beneficiary: Id.new(t[3]),
|
117
|
-
amount: Amount.new(coins: t[2].to_i)
|
118
|
-
}
|
119
|
-
yield hash
|
103
|
+
txns.each do |t|
|
104
|
+
yield t unless t[:amount].negative?
|
120
105
|
end
|
121
106
|
end
|
122
107
|
|
108
|
+
def txns
|
109
|
+
lines.drop(3)
|
110
|
+
.each_with_index
|
111
|
+
.map { |t, i| fields(t, i + 4) }
|
112
|
+
.sort_by { |a| a[:date] }
|
113
|
+
end
|
114
|
+
|
123
115
|
private
|
124
116
|
|
125
|
-
def
|
126
|
-
|
117
|
+
def max
|
118
|
+
all = txns
|
119
|
+
if all.empty?
|
120
|
+
0
|
121
|
+
else
|
122
|
+
all.select { |t| t[:amount].negative? }.max_by { |t| t[:id] }[:id]
|
123
|
+
end
|
124
|
+
end
|
125
|
+
|
126
|
+
def to_line(txn)
|
127
|
+
[
|
128
|
+
txn[:id],
|
129
|
+
txn[:date].utc.iso8601,
|
130
|
+
txn[:amount].to_i,
|
131
|
+
txn[:bnf],
|
132
|
+
txn[:details],
|
133
|
+
txn[:sign]
|
134
|
+
].join(';') + "\n"
|
135
|
+
end
|
136
|
+
|
137
|
+
def fields(line, idx)
|
138
|
+
regex = Regexp.new(
|
139
|
+
[
|
140
|
+
'([0-9]+)',
|
141
|
+
'([0-9]{4}-[0-9]{2}-[0-9]{2}T[0-9]{2}:[0-9]{2}:[0-9]{2}Z)',
|
142
|
+
'(-?[0-9]+)',
|
143
|
+
'([a-f0-9]{16})',
|
144
|
+
'([a-zA-Z0-9 -.]{1,128})',
|
145
|
+
'([A-Za-z0-9+/]+={0,3})?'
|
146
|
+
].join(';')
|
147
|
+
)
|
148
|
+
clean = line.strip
|
149
|
+
raise "Invalid line ##{idx}: #{line.inspect}" unless regex.match(clean)
|
150
|
+
parts = clean.split(';')
|
151
|
+
{
|
152
|
+
id: parts[0].to_i,
|
153
|
+
date: Time.parse(parts[1]),
|
154
|
+
amount: Amount.new(coins: parts[2].to_i),
|
155
|
+
bnf: Id.new(parts[3]),
|
156
|
+
details: parts[4],
|
157
|
+
sign: parts[5]
|
158
|
+
}
|
127
159
|
end
|
128
160
|
|
129
161
|
def lines
|
data/lib/zold/wallets.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
# Copyright (c) 2018
|
1
|
+
# Copyright (c) 2018 Yegor Bugayenko
|
2
2
|
#
|
3
3
|
# Permission is hereby granted, free of charge, to any person obtaining a copy
|
4
4
|
# of this software and associated documentation files (the 'Software'), to deal
|
@@ -18,11 +18,12 @@
|
|
18
18
|
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
19
19
|
# SOFTWARE.
|
20
20
|
|
21
|
+
require_relative 'id.rb'
|
21
22
|
require_relative 'wallet.rb'
|
22
23
|
|
23
24
|
# The local collection of wallets.
|
24
25
|
# Author:: Yegor Bugayenko (yegor256@gmail.com)
|
25
|
-
# Copyright:: Copyright (c) 2018
|
26
|
+
# Copyright:: Copyright (c) 2018 Yegor Bugayenko
|
26
27
|
# License:: MIT
|
27
28
|
module Zold
|
28
29
|
# Collection of local wallets
|
@@ -31,12 +32,18 @@ module Zold
|
|
31
32
|
@dir = dir
|
32
33
|
end
|
33
34
|
|
34
|
-
def
|
35
|
-
@dir
|
35
|
+
def path
|
36
|
+
File.expand_path(@dir)
|
36
37
|
end
|
37
38
|
|
38
|
-
def
|
39
|
-
Dir.new(@dir).select
|
39
|
+
def all
|
40
|
+
Dir.new(@dir).select do |f|
|
41
|
+
file = File.join(@dir, f)
|
42
|
+
File.file?(file) &&
|
43
|
+
!File.directory?(file) &&
|
44
|
+
f =~ /[0-9a-fA-F]{16}/ &&
|
45
|
+
Id.new(f).to_s == f
|
46
|
+
end
|
40
47
|
end
|
41
48
|
|
42
49
|
def find(id)
|
data/resources/remotes
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
b1.zold.io,80,0
|
@@ -0,0 +1,41 @@
|
|
1
|
+
# Copyright (c) 2018 Yegor Bugayenko
|
2
|
+
#
|
3
|
+
# Permission is hereby granted, free of charge, to any person obtaining a copy
|
4
|
+
# of this software and associated documentation files (the 'Software'), to deal
|
5
|
+
# in the Software without restriction, including without limitation the rights
|
6
|
+
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
7
|
+
# copies of the Software, and to permit persons to whom the Software is
|
8
|
+
# furnished to do so, subject to the following conditions:
|
9
|
+
#
|
10
|
+
# The above copyright notice and this permission notice shall be included in all
|
11
|
+
# copies or substantial portions of the Software.
|
12
|
+
#
|
13
|
+
# THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
14
|
+
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
15
|
+
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFINGEMENT. IN NO EVENT SHALL THE
|
16
|
+
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
17
|
+
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
18
|
+
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
19
|
+
# SOFTWARE.
|
20
|
+
|
21
|
+
require 'minitest/autorun'
|
22
|
+
require 'tmpdir'
|
23
|
+
require 'time'
|
24
|
+
require_relative '../../lib/zold/copies.rb'
|
25
|
+
require_relative '../../lib/zold/commands/clean.rb'
|
26
|
+
|
27
|
+
# CLEAN test.
|
28
|
+
# Author:: Yegor Bugayenko (yegor256@gmail.com)
|
29
|
+
# Copyright:: Copyright (c) 2018 Yegor Bugayenko
|
30
|
+
# License:: MIT
|
31
|
+
class TestClean < Minitest::Test
|
32
|
+
def test_cleans_copies
|
33
|
+
Dir.mktmpdir 'test' do |dir|
|
34
|
+
copies = Zold::Copies.new(File.join(dir, 'copies'))
|
35
|
+
copies.add('a1', 'host-1', 80, 1, Time.now - 26 * 60)
|
36
|
+
copies.add('a2', 'host-2', 80, 2, Time.now - 26 * 60)
|
37
|
+
Zold::Clean.new(copies: copies).run
|
38
|
+
assert(copies.all.empty?)
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
@@ -1,4 +1,4 @@
|
|
1
|
-
# Copyright (c) 2018
|
1
|
+
# Copyright (c) 2018 Yegor Bugayenko
|
2
2
|
#
|
3
3
|
# Permission is hereby granted, free of charge, to any person obtaining a copy
|
4
4
|
# of this software and associated documentation files (the 'Software'), to deal
|
@@ -26,7 +26,7 @@ require_relative '../../lib/zold/commands/create.rb'
|
|
26
26
|
|
27
27
|
# CREATE test.
|
28
28
|
# Author:: Yegor Bugayenko (yegor256@gmail.com)
|
29
|
-
# Copyright:: Copyright (c) 2018
|
29
|
+
# Copyright:: Copyright (c) 2018 Yegor Bugayenko
|
30
30
|
# License:: MIT
|
31
31
|
class TestCreate < Minitest::Test
|
32
32
|
def test_creates_wallet
|
@@ -0,0 +1,61 @@
|
|
1
|
+
# Copyright (c) 2018 Yegor Bugayenko
|
2
|
+
#
|
3
|
+
# Permission is hereby granted, free of charge, to any person obtaining a copy
|
4
|
+
# of this software and associated documentation files (the 'Software'), to deal
|
5
|
+
# in the Software without restriction, including without limitation the rights
|
6
|
+
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
7
|
+
# copies of the Software, and to permit persons to whom the Software is
|
8
|
+
# furnished to do so, subject to the following conditions:
|
9
|
+
#
|
10
|
+
# The above copyright notice and this permission notice shall be included in all
|
11
|
+
# copies or substantial portions of the Software.
|
12
|
+
#
|
13
|
+
# THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
14
|
+
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
15
|
+
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFINGEMENT. IN NO EVENT SHALL THE
|
16
|
+
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
17
|
+
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
18
|
+
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
19
|
+
# SOFTWARE.
|
20
|
+
|
21
|
+
require 'minitest/autorun'
|
22
|
+
require 'tmpdir'
|
23
|
+
require 'json'
|
24
|
+
require 'time'
|
25
|
+
require 'webmock/minitest'
|
26
|
+
require_relative '../../lib/zold/wallet.rb'
|
27
|
+
require_relative '../../lib/zold/id.rb'
|
28
|
+
require_relative '../../lib/zold/copies.rb'
|
29
|
+
require_relative '../../lib/zold/key.rb'
|
30
|
+
require_relative '../../lib/zold/commands/pay.rb'
|
31
|
+
require_relative '../../lib/zold/commands/diff.rb'
|
32
|
+
|
33
|
+
# DIFF test.
|
34
|
+
# Author:: Yegor Bugayenko (yegor256@gmail.com)
|
35
|
+
# Copyright:: Copyright (c) 2018 Yegor Bugayenko
|
36
|
+
# License:: MIT
|
37
|
+
class TestDiff < Minitest::Test
|
38
|
+
def test_diff_with_copies
|
39
|
+
Dir.mktmpdir 'test' do |dir|
|
40
|
+
id = Zold::Id.new
|
41
|
+
file = File.join(dir, id.to_s)
|
42
|
+
wallet = Zold::Wallet.new(file)
|
43
|
+
wallet.init(id, Zold::Key.new(file: 'fixtures/id_rsa.pub'))
|
44
|
+
first = Zold::Wallet.new(File.join(dir, 'copy-1'))
|
45
|
+
File.write(first.path, File.read(wallet.path))
|
46
|
+
second = Zold::Wallet.new(File.join(dir, 'copy-2'))
|
47
|
+
File.write(second.path, File.read(wallet.path))
|
48
|
+
Zold::Pay.new(
|
49
|
+
payer: first,
|
50
|
+
receiver: second,
|
51
|
+
amount: Zold::Amount.new(zld: 14.95),
|
52
|
+
pvtkey: Zold::Key.new(file: 'fixtures/id_rsa')
|
53
|
+
).run(['--force'])
|
54
|
+
copies = Zold::Copies.new(File.join(dir, 'copies'))
|
55
|
+
copies.add(File.read(first.path), 'host-1', 80, 5)
|
56
|
+
copies.add(File.read(second.path), 'host-2', 80, 5)
|
57
|
+
diff = Zold::Diff.new(wallet: wallet, copies: copies).run
|
58
|
+
assert(diff.include?('+1;'))
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
@@ -0,0 +1,65 @@
|
|
1
|
+
# Copyright (c) 2018 Yegor Bugayenko
|
2
|
+
#
|
3
|
+
# Permission is hereby granted, free of charge, to any person obtaining a copy
|
4
|
+
# of this software and associated documentation files (the 'Software'), to deal
|
5
|
+
# in the Software without restriction, including without limitation the rights
|
6
|
+
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
7
|
+
# copies of the Software, and to permit persons to whom the Software is
|
8
|
+
# furnished to do so, subject to the following conditions:
|
9
|
+
#
|
10
|
+
# The above copyright notice and this permission notice shall be included in all
|
11
|
+
# copies or substantial portions of the Software.
|
12
|
+
#
|
13
|
+
# THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
14
|
+
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
15
|
+
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFINGEMENT. IN NO EVENT SHALL THE
|
16
|
+
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
17
|
+
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
18
|
+
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
19
|
+
# SOFTWARE.
|
20
|
+
|
21
|
+
require 'minitest/autorun'
|
22
|
+
require 'tmpdir'
|
23
|
+
require 'json'
|
24
|
+
require 'time'
|
25
|
+
require 'webmock/minitest'
|
26
|
+
require_relative '../../lib/zold/wallet.rb'
|
27
|
+
require_relative '../../lib/zold/remotes.rb'
|
28
|
+
require_relative '../../lib/zold/id.rb'
|
29
|
+
require_relative '../../lib/zold/copies.rb'
|
30
|
+
require_relative '../../lib/zold/key.rb'
|
31
|
+
require_relative '../../lib/zold/score.rb'
|
32
|
+
require_relative '../../lib/zold/commands/fetch.rb'
|
33
|
+
|
34
|
+
# FETCH test.
|
35
|
+
# Author:: Yegor Bugayenko (yegor256@gmail.com)
|
36
|
+
# Copyright:: Copyright (c) 2018 Yegor Bugayenko
|
37
|
+
# License:: MIT
|
38
|
+
class TestFetch < Minitest::Test
|
39
|
+
def test_fetches_wallet
|
40
|
+
Dir.mktmpdir 'test' do |dir|
|
41
|
+
id = Zold::Id.new
|
42
|
+
file = File.join(dir, id.to_s)
|
43
|
+
wallet = Zold::Wallet.new(file)
|
44
|
+
wallet.init(id, Zold::Key.new(file: 'fixtures/id_rsa.pub'))
|
45
|
+
copies = Zold::Copies.new(File.join(dir, 'copies'))
|
46
|
+
remotes = Zold::Remotes.new(File.join(dir, 'remotes.csv'))
|
47
|
+
remotes.clean
|
48
|
+
stub_request(:get, "http://fake-1/wallet/#{id}").to_return(
|
49
|
+
status: 200,
|
50
|
+
body: {
|
51
|
+
'score': Zold::Score::ZERO.to_h,
|
52
|
+
'body': File.read(wallet.path)
|
53
|
+
}.to_json
|
54
|
+
)
|
55
|
+
stub_request(:get, "http://fake-2/wallet/#{id}").to_return(
|
56
|
+
status: 404
|
57
|
+
)
|
58
|
+
remotes.add('fake-1', 80)
|
59
|
+
remotes.add('fake-2', 80)
|
60
|
+
Zold::Fetch.new(wallet: wallet, copies: copies, remotes: remotes).run
|
61
|
+
assert_equal(copies.all[0][:name], '1')
|
62
|
+
assert_equal(copies.all[0][:score], 0)
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|