zold 0.0.8 → 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.
Files changed (77) hide show
  1. checksums.yaml +4 -4
  2. data/.github/ISSUE_TEMPLATE.md +12 -0
  3. data/.github/PULL_REQUEST_TEMPLATE.md +11 -0
  4. data/.rubocop.yml +9 -1
  5. data/.simplecov +2 -2
  6. data/.travis.yml +1 -1
  7. data/Gemfile +1 -1
  8. data/LICENSE.txt +1 -1
  9. data/Procfile +1 -1
  10. data/README.md +208 -101
  11. data/Rakefile +2 -1
  12. data/bin/zold +135 -54
  13. data/features/cli.feature +1 -1
  14. data/features/step_definitions/steps.rb +1 -1
  15. data/features/support/env.rb +1 -1
  16. data/fixtures/scripts/push-and-pull.sh +35 -0
  17. data/lib/zold.rb +2 -2
  18. data/lib/zold/amount.rb +10 -2
  19. data/lib/zold/commands/{send.rb → clean.rb} +16 -16
  20. data/lib/zold/commands/create.rb +7 -5
  21. data/lib/zold/commands/diff.rb +59 -0
  22. data/lib/zold/commands/fetch.rb +74 -0
  23. data/lib/zold/commands/{pull.rb → list.rb} +11 -17
  24. data/lib/zold/commands/merge.rb +50 -0
  25. data/lib/zold/commands/node.rb +94 -0
  26. data/lib/zold/commands/pay.rb +58 -0
  27. data/lib/zold/commands/{check.rb → propagate.rb} +19 -20
  28. data/lib/zold/commands/push.rb +12 -12
  29. data/lib/zold/commands/remote.rb +115 -0
  30. data/lib/zold/commands/{balance.rb → show.rb} +11 -7
  31. data/lib/zold/copies.rb +126 -0
  32. data/lib/zold/http.rb +70 -0
  33. data/lib/zold/id.rb +8 -3
  34. data/lib/zold/key.rb +2 -2
  35. data/lib/zold/log.rb +51 -2
  36. data/lib/zold/node/farm.rb +81 -0
  37. data/lib/zold/node/front.rb +94 -46
  38. data/lib/zold/patch.rb +58 -0
  39. data/lib/zold/remotes.rb +106 -0
  40. data/lib/zold/score.rb +101 -0
  41. data/lib/zold/signature.rb +48 -0
  42. data/lib/zold/version.rb +3 -3
  43. data/lib/zold/wallet.rb +87 -55
  44. data/lib/zold/wallets.rb +13 -6
  45. data/resources/remotes +1 -0
  46. data/test/commands/test_clean.rb +41 -0
  47. data/test/commands/test_create.rb +2 -2
  48. data/test/commands/test_diff.rb +61 -0
  49. data/test/commands/test_fetch.rb +65 -0
  50. data/test/commands/test_list.rb +42 -0
  51. data/test/commands/test_merge.rb +62 -0
  52. data/test/commands/test_node.rb +56 -0
  53. data/test/commands/{test_send.rb → test_pay.rb} +10 -11
  54. data/test/commands/test_remote.rb +60 -0
  55. data/test/commands/{test_balance.rb → test_show.rb} +6 -8
  56. data/test/node/fake_node.rb +73 -0
  57. data/test/node/test_farm.rb +34 -0
  58. data/test/node/test_front.rb +26 -57
  59. data/test/test__helper.rb +1 -1
  60. data/test/test_amount.rb +10 -2
  61. data/test/test_copies.rb +73 -0
  62. data/test/test_http.rb +42 -0
  63. data/test/test_id.rb +2 -2
  64. data/test/test_key.rb +10 -10
  65. data/test/test_patch.rb +59 -0
  66. data/test/test_remotes.rb +72 -0
  67. data/test/test_score.rb +79 -0
  68. data/test/test_signature.rb +45 -0
  69. data/test/test_wallet.rb +18 -35
  70. data/test/test_wallets.rb +14 -3
  71. data/test/test_zold.rb +52 -5
  72. data/zold.gemspec +5 -3
  73. metadata +92 -21
  74. data/CONTRIBUTING.md +0 -19
  75. data/views/index.haml +0 -6
  76. data/views/layout.haml +0 -26
  77. data/views/not_found.haml +0 -3
@@ -0,0 +1,42 @@
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_relative '../../lib/zold/wallet.rb'
24
+ require_relative '../../lib/zold/key.rb'
25
+ require_relative '../../lib/zold/id.rb'
26
+ require_relative '../../lib/zold/commands/list.rb'
27
+
28
+ # LIST test.
29
+ # Author:: Yegor Bugayenko (yegor256@gmail.com)
30
+ # Copyright:: Copyright (c) 2018 Yegor Bugayenko
31
+ # License:: MIT
32
+ class TestList < Minitest::Test
33
+ def test_lists_wallets_with_balances
34
+ Dir.mktmpdir 'test' do |dir|
35
+ id = Zold::Id.new
36
+ wallets = Zold::Wallets.new(dir)
37
+ wallet = wallets.find(id)
38
+ wallet.init(Zold::Id.new, Zold::Key.new(file: 'fixtures/id_rsa.pub'))
39
+ Zold::List.new(wallets: wallets).run
40
+ end
41
+ end
42
+ end
@@ -0,0 +1,62 @@
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/score.rb'
31
+ require_relative '../../lib/zold/patch.rb'
32
+ require_relative '../../lib/zold/commands/merge.rb'
33
+ require_relative '../../lib/zold/commands/pay.rb'
34
+
35
+ # MERGE test.
36
+ # Author:: Yegor Bugayenko (yegor256@gmail.com)
37
+ # Copyright:: Copyright (c) 2018 Yegor Bugayenko
38
+ # License:: MIT
39
+ class TestMerge < Minitest::Test
40
+ def test_merges_wallet
41
+ Dir.mktmpdir 'test' do |dir|
42
+ id = Zold::Id.new
43
+ file = File.join(dir, id.to_s)
44
+ wallet = Zold::Wallet.new(file)
45
+ wallet.init(id, Zold::Key.new(file: 'fixtures/id_rsa.pub'))
46
+ first = Zold::Wallet.new(File.join(dir, 'copy-1'))
47
+ File.write(first.path, File.read(wallet.path))
48
+ second = Zold::Wallet.new(File.join(dir, 'copy-2'))
49
+ File.write(second.path, File.read(wallet.path))
50
+ Zold::Pay.new(
51
+ payer: first,
52
+ receiver: second,
53
+ amount: Zold::Amount.new(zld: 14.95),
54
+ pvtkey: Zold::Key.new(file: 'fixtures/id_rsa')
55
+ ).run(['--force'])
56
+ copies = Zold::Copies.new(File.join(dir, 'copies'))
57
+ copies.add(File.read(first.path), 'host-1', 80, 5)
58
+ copies.add(File.read(second.path), 'host-2', 80, 5)
59
+ Zold::Merge.new(wallet: wallet, copies: copies).run
60
+ end
61
+ end
62
+ end
@@ -0,0 +1,56 @@
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 'webmock/minitest'
24
+ require_relative '../../lib/zold/wallet.rb'
25
+ require_relative '../../lib/zold/remotes.rb'
26
+ require_relative '../../lib/zold/id.rb'
27
+ require_relative '../../lib/zold/copies.rb'
28
+ require_relative '../../lib/zold/key.rb'
29
+ require_relative '../../lib/zold/commands/node.rb'
30
+ require_relative '../../lib/zold/commands/fetch.rb'
31
+ require_relative '../../lib/zold/commands/push.rb'
32
+ require_relative '../node/fake_node.rb'
33
+
34
+ # NODE test.
35
+ # Author:: Yegor Bugayenko (yegor256@gmail.com)
36
+ # Copyright:: Copyright (c) 2018 Yegor Bugayenko
37
+ # License:: MIT
38
+ class TestNode < Minitest::Test
39
+ def test_push_and_fetch
40
+ FakeNode.new.run do |port|
41
+ Dir.mktmpdir 'test' do |dir|
42
+ id = Zold::Id.new
43
+ wallet = Zold::Wallet.new(File.join(dir, id.to_s))
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
+ remotes.add('localhost', port)
49
+ Zold::Push.new(wallet: wallet, remotes: remotes).run
50
+ Zold::Fetch.new(wallet: wallet, copies: copies, remotes: remotes).run
51
+ assert_equal(copies.all[0][:name], '1')
52
+ assert_equal(copies.all[0][:score], 0)
53
+ end
54
+ end
55
+ end
56
+ end
@@ -1,4 +1,4 @@
1
- # Copyright (c) 2018 Zerocracy, Inc.
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
@@ -21,30 +21,29 @@
21
21
  require 'minitest/autorun'
22
22
  require 'tmpdir'
23
23
  require_relative '../../lib/zold/wallet.rb'
24
+ require_relative '../../lib/zold/amount.rb'
24
25
  require_relative '../../lib/zold/key.rb'
25
26
  require_relative '../../lib/zold/id.rb'
26
- require_relative '../../lib/zold/commands/send.rb'
27
+ require_relative '../../lib/zold/commands/pay.rb'
27
28
 
28
- # SEND test.
29
+ # PAY test.
29
30
  # Author:: Yegor Bugayenko (yegor256@gmail.com)
30
- # Copyright:: Copyright (c) 2018 Zerocracy, Inc.
31
+ # Copyright:: Copyright (c) 2018 Yegor Bugayenko
31
32
  # License:: MIT
32
- class TestSend < Minitest::Test
33
+ class TestPay < Minitest::Test
33
34
  def test_sends_from_wallet_to_wallet
34
35
  Dir.mktmpdir 'test' do |dir|
35
- source = Zold::Wallet.new(File.join(dir, 'source.xml'))
36
+ source = Zold::Wallet.new(File.join(dir, 'source'))
36
37
  source.init(Zold::Id.new, Zold::Key.new(file: 'fixtures/id_rsa.pub'))
37
- target = Zold::Wallet.new(File.join(dir, 'target.xml'))
38
- target.init(Zold::Id.new, Zold::Key.new(file: 'fixtures/id_rsa.pub'))
38
+ target = Zold::Id.new
39
39
  amount = Zold::Amount.new(zld: 14.95)
40
- Zold::Send.new(
40
+ Zold::Pay.new(
41
41
  payer: source,
42
42
  receiver: target,
43
43
  amount: amount,
44
44
  pvtkey: Zold::Key.new(file: 'fixtures/id_rsa')
45
- ).run
45
+ ).run(['--force'])
46
46
  assert source.balance == amount.mul(-1)
47
- assert target.balance == amount
48
47
  end
49
48
  end
50
49
  end
@@ -0,0 +1,60 @@
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 'webmock/minitest'
24
+ require_relative '../../lib/zold/wallets.rb'
25
+ require_relative '../../lib/zold/remotes.rb'
26
+ require_relative '../../lib/zold/key.rb'
27
+ require_relative '../../lib/zold/score.rb'
28
+ require_relative '../../lib/zold/commands/remote.rb'
29
+
30
+ # REMOTE test.
31
+ # Author:: Yegor Bugayenko (yegor256@gmail.com)
32
+ # Copyright:: Copyright (c) 2018 Yegor Bugayenko
33
+ # License:: MIT
34
+ class TestRemote < Minitest::Test
35
+ def test_updates_remote
36
+ Dir.mktmpdir 'test' do |dir|
37
+ remotes = Zold::Remotes.new(File.join(dir, 'a/b/c/remotes'))
38
+ cmd = Zold::Remote.new(remotes: remotes)
39
+ cmd.run(['clean'])
40
+ cmd.run(%w[add localhost 1])
41
+ stub_request(:get, 'http://localhost:1/remotes').to_return(
42
+ status: 200,
43
+ body: {
44
+ score: Zold::Score::ZERO.to_h,
45
+ all: [
46
+ { host: 'localhost', port: 888 },
47
+ { host: 'localhost', port: 999 }
48
+ ]
49
+ }.to_json
50
+ )
51
+ cmd.run(%w[add localhost 2])
52
+ stub_request(:get, 'http://localhost:2/remotes').to_return(
53
+ status: 404
54
+ )
55
+ assert_equal(remotes.all.count, 2)
56
+ cmd.run(['update'])
57
+ assert_equal(3, remotes.all.count)
58
+ end
59
+ end
60
+ end
@@ -1,4 +1,4 @@
1
- # Copyright (c) 2018 Zerocracy, Inc.
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
@@ -23,21 +23,19 @@ require 'tmpdir'
23
23
  require_relative '../../lib/zold/wallet.rb'
24
24
  require_relative '../../lib/zold/key.rb'
25
25
  require_relative '../../lib/zold/id.rb'
26
- require_relative '../../lib/zold/commands/balance.rb'
26
+ require_relative '../../lib/zold/commands/show.rb'
27
27
 
28
- # BALANCE test.
28
+ # SHOW test.
29
29
  # Author:: Yegor Bugayenko (yegor256@gmail.com)
30
- # Copyright:: Copyright (c) 2018 Zerocracy, Inc.
30
+ # Copyright:: Copyright (c) 2018 Yegor Bugayenko
31
31
  # License:: MIT
32
- class TestBalance < Minitest::Test
32
+ class TestShow < Minitest::Test
33
33
  def test_checks_wallet_balance
34
34
  Dir.mktmpdir 'test' do |dir|
35
35
  id = Zold::Id.new
36
36
  wallet = Zold::Wallets.new(dir).find(id)
37
37
  wallet.init(Zold::Id.new, Zold::Key.new(file: 'fixtures/id_rsa.pub'))
38
- balance = Zold::Balance.new(
39
- wallet: wallet
40
- ).run
38
+ balance = Zold::Show.new(wallet: wallet).run
41
39
  assert balance == Zold::Amount::ZERO
42
40
  end
43
41
  end
@@ -0,0 +1,73 @@
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 'tmpdir'
22
+ require 'webmock/minitest'
23
+ require_relative '../../lib/zold/log.rb'
24
+ require_relative '../../lib/zold/http.rb'
25
+ require_relative '../../lib/zold/commands/node.rb'
26
+
27
+ # Fake node.
28
+ # Author:: Yegor Bugayenko (yegor256@gmail.com)
29
+ # Copyright:: Copyright (c) 2018 Yegor Bugayenko
30
+ # License:: MIT
31
+ class FakeNode
32
+ def initialize(log: Zold::Log::Quiet.new)
33
+ @log = log
34
+ end
35
+
36
+ def run
37
+ WebMock.allow_net_connect!
38
+ Dir.mktmpdir 'test' do |dir|
39
+ server = TCPServer.new('127.0.0.1', 0)
40
+ port = server.addr[1]
41
+ server.close
42
+ node = Thread.new do
43
+ begin
44
+ Thread.current.abort_on_exception = true
45
+ home = File.join(dir, 'node-home')
46
+ Zold::Node.new(log: @log).run(
47
+ [
48
+ '--port', port.to_s,
49
+ '--host=locahost',
50
+ '--bind-port', port.to_s,
51
+ '--threads=1',
52
+ '--home', home
53
+ ]
54
+ )
55
+ rescue StandardError => e
56
+ @log.error(e.message + "\n" + e.backtrace.join("\n"))
57
+ end
58
+ end
59
+ home = URI("http://localhost:#{port}/")
60
+ while Zold::Http.new(home).get.code == '599' && node.alive?
61
+ sleep 1
62
+ @log.debug("Waiting for #{home}...")
63
+ end
64
+ begin
65
+ yield port
66
+ rescue StandardError => e
67
+ @log.error(e.message + "\n" + e.backtrace.join("\n"))
68
+ ensure
69
+ node.exit
70
+ end
71
+ end
72
+ end
73
+ end
@@ -0,0 +1,34 @@
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 'rack/test'
23
+ require 'tmpdir'
24
+ require_relative '../../lib/zold/node/farm.rb'
25
+
26
+ class FarmTest < Minitest::Test
27
+ def test_makes_best_score_in_background
28
+ farm = Zold::Farm.new
29
+ farm.start('localhost', 80, threads: 4, strength: 2)
30
+ sleep 1 while farm.best.empty? || farm.best[0].value.zero?
31
+ assert(farm.best[0].value > 0)
32
+ farm.stop
33
+ end
34
+ end
@@ -1,4 +1,4 @@
1
- # Copyright (c) 2018 Zerocracy, Inc.
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,68 +19,37 @@
19
19
  # SOFTWARE.
20
20
 
21
21
  require 'minitest/autorun'
22
- require 'rack/test'
22
+ require 'tmpdir'
23
23
  require_relative '../../lib/zold/key.rb'
24
24
  require_relative '../../lib/zold/id.rb'
25
25
  require_relative '../../lib/zold/amount.rb'
26
26
  require_relative '../../lib/zold/wallet.rb'
27
- require_relative '../../lib/zold/node/front.rb'
27
+ require_relative '../../lib/zold/http.rb'
28
+ require_relative 'fake_node.rb'
28
29
 
29
30
  class FrontTest < Minitest::Test
30
- include Rack::Test::Methods
31
-
32
- def app
33
- Zold::Front.new
34
- end
35
-
36
- def test_renders_version
37
- get('/version')
38
- assert(last_response.ok?)
39
- end
40
-
41
- def test_robots_txt
42
- get('/robots.txt')
43
- assert(last_response.ok?)
44
- end
45
-
46
- def test_it_renders_home_page
47
- get('/')
48
- assert(last_response.ok?)
49
- assert(last_response.body.include?('zold'))
50
- end
51
-
52
- def test_pushes_a_wallet
53
- Dir.mktmpdir 'test' do |dir|
54
- id = Zold::Id::ROOT
55
- file = File.join(dir, "#{id}.xml")
56
- wallet = Zold::Wallet.new(file)
57
- wallet.init(id, Zold::Key.new(file: 'fixtures/id_rsa.pub'))
58
- put("/wallets/#{id}", File.read(file))
59
- assert(last_response.ok?, last_response.body)
60
- key = Zold::Key.new(file: 'fixtures/id_rsa')
61
- wallet.sub(Zold::Amount.new(zld: 39.99), Zold::Id.new, key)
62
- put("/wallets/#{id}", File.read(file))
63
- assert(last_response.ok?, last_response.body)
31
+ def test_renders_public_pages
32
+ FakeNode.new.run do |port|
33
+ {
34
+ '200' => [
35
+ '/robots.txt',
36
+ '/',
37
+ '/remotes'
38
+ ],
39
+ '404' => [
40
+ '/this-is-absent',
41
+ '/wallet/ffffeeeeddddcccc'
42
+ ]
43
+ }.each do |code, paths|
44
+ paths.each do |p|
45
+ uri = URI("http://localhost:#{port}#{p}")
46
+ response = Zold::Http.new(uri).get
47
+ assert_equal(
48
+ code, response.code,
49
+ "Invalid response code for #{uri}: #{response.message}"
50
+ )
51
+ end
52
+ end
64
53
  end
65
54
  end
66
-
67
- def test_pulls_a_wallet
68
- Dir.mktmpdir 'test' do |dir|
69
- id = Zold::Id.new
70
- file = File.join(dir, "#{id}.xml")
71
- wallet = Zold::Wallet.new(file)
72
- wallet.init(id, Zold::Key.new(file: 'fixtures/id_rsa.pub'))
73
- put("/wallets/#{id}", File.read(file))
74
- assert(last_response.ok?, last_response.body)
75
- get("/wallets/#{id}")
76
- assert(last_response.ok?, last_response.body)
77
- File.write(file, last_response.body)
78
- assert wallet.balance.zero?
79
- end
80
- end
81
-
82
- def test_pulls_an_absent_wallet
83
- get('/wallets/ffffeeeeddddcccc')
84
- assert(last_response.status == 404)
85
- end
86
55
  end