zold 0.32.0 → 0.32.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 (171) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile.lock +1 -1
  3. data/lib/zold/version.rb +1 -1
  4. data/zold.gemspec +1 -1
  5. metadata +2 -168
  6. data/.0pdd.yml +0 -12
  7. data/.gitattributes +0 -9
  8. data/.github/typos.toml +0 -11
  9. data/.github/workflows/actionlint.yml +0 -25
  10. data/.github/workflows/bashate.yml +0 -25
  11. data/.github/workflows/codecov.yml +0 -27
  12. data/.github/workflows/copyrights.yml +0 -15
  13. data/.github/workflows/hadolint.yml +0 -14
  14. data/.github/workflows/markdown-lint.yml +0 -19
  15. data/.github/workflows/pdd.yml +0 -19
  16. data/.github/workflows/rake.yml +0 -31
  17. data/.github/workflows/reuse.yml +0 -19
  18. data/.github/workflows/shellcheck.yml +0 -19
  19. data/.github/workflows/typos.yml +0 -21
  20. data/.github/workflows/xcop.yml +0 -15
  21. data/.github/workflows/yamllint.yml +0 -19
  22. data/.gitignore +0 -15
  23. data/.pdd +0 -7
  24. data/.rubocop.yml +0 -66
  25. data/.ruby-version +0 -1
  26. data/.rultor.yml +0 -41
  27. data/cucumber.yml +0 -6
  28. data/features/cli.feature +0 -18
  29. data/features/gem_package.feature +0 -28
  30. data/features/step_definitions/steps.rb +0 -67
  31. data/features/support/env.rb +0 -9
  32. data/fixtures/448b451bc62e8e16.z +0 -1005
  33. data/fixtures/id_rsa +0 -51
  34. data/fixtures/id_rsa-2 +0 -51
  35. data/fixtures/id_rsa-2.pub +0 -1
  36. data/fixtures/id_rsa.pub +0 -1
  37. data/fixtures/keys/1.pub +0 -1
  38. data/fixtures/keys/2 +0 -51
  39. data/fixtures/keys/2.pub +0 -1
  40. data/fixtures/merge/asserts.rb +0 -20
  41. data/fixtures/merge/id_rsa +0 -51
  42. data/fixtures/merge/id_rsa.pub +0 -1
  43. data/fixtures/merge/into_no_wallet/assert.rb +0 -8
  44. data/fixtures/merge/into_no_wallet/copies/0123456789abcdef/1.zc +0 -6
  45. data/fixtures/merge/into_no_wallet/copies/0123456789abcdef/scores.zc +0 -1
  46. data/fixtures/merge/into_no_wallet/opts +0 -1
  47. data/fixtures/merge/legacy_negatives_stay/0123456789abcdef.z +0 -6
  48. data/fixtures/merge/legacy_negatives_stay/assert.rb +0 -8
  49. data/fixtures/merge/legacy_negatives_stay/copies/0123456789abcdef/1.zc +0 -6
  50. data/fixtures/merge/legacy_negatives_stay/copies/0123456789abcdef/scores.zc +0 -1
  51. data/fixtures/merge/legacy_negatives_stay/opts +0 -2
  52. data/fixtures/merge/missed_wallets/0000000000000000.z +0 -6
  53. data/fixtures/merge/missed_wallets/0123456789abcdef.z +0 -4
  54. data/fixtures/merge/missed_wallets/assert.rb +0 -8
  55. data/fixtures/merge/missed_wallets/copies/0123456789abcdef/1.zc +0 -8
  56. data/fixtures/merge/missed_wallets/copies/0123456789abcdef/scores.zc +0 -1
  57. data/fixtures/merge/missed_wallets/opts +0 -3
  58. data/fixtures/merge/negative_overwriting/0123456789abcdef.z +0 -6
  59. data/fixtures/merge/negative_overwriting/146b852f2d9ad984.z +0 -6
  60. data/fixtures/merge/negative_overwriting/assert.rb +0 -8
  61. data/fixtures/merge/negative_overwriting/copies/0123456789abcdef/1.zc +0 -6
  62. data/fixtures/merge/negative_overwriting/copies/0123456789abcdef/scores.zc +0 -1
  63. data/fixtures/merge/negative_overwriting/opts +0 -2
  64. data/fixtures/merge/negatives_in_between/0000000000000000.z +0 -6
  65. data/fixtures/merge/negatives_in_between/0123456789abcdef.z +0 -4
  66. data/fixtures/merge/negatives_in_between/assert.rb +0 -8
  67. data/fixtures/merge/negatives_in_between/copies/0123456789abcdef/1.zc +0 -6
  68. data/fixtures/merge/negatives_in_between/copies/0123456789abcdef/2.zc +0 -6
  69. data/fixtures/merge/negatives_in_between/copies/0123456789abcdef/3.zc +0 -6
  70. data/fixtures/merge/negatives_in_between/copies/0123456789abcdef/scores.zc +0 -3
  71. data/fixtures/merge/negatives_in_between/opts +0 -1
  72. data/fixtures/merge/random_expenses/0000000000000000.z +0 -6
  73. data/fixtures/merge/random_expenses/0123456789abcdef.z +0 -6
  74. data/fixtures/merge/random_expenses/assert.rb +0 -8
  75. data/fixtures/merge/random_expenses/copies/0123456789abcdef/1.zc +0 -7
  76. data/fixtures/merge/random_expenses/copies/0123456789abcdef/2.zc +0 -7
  77. data/fixtures/merge/random_expenses/copies/0123456789abcdef/3.zc +0 -7
  78. data/fixtures/merge/random_expenses/copies/0123456789abcdef/4.zc +0 -7
  79. data/fixtures/merge/random_expenses/copies/0123456789abcdef/5.zc +0 -7
  80. data/fixtures/merge/random_expenses/copies/0123456789abcdef/scores.zc +0 -5
  81. data/fixtures/merge/random_expenses/opts +0 -1
  82. data/fixtures/merge/simple_case/0000000000000000.z +0 -6
  83. data/fixtures/merge/simple_case/0123456789abcdef.z +0 -4
  84. data/fixtures/merge/simple_case/assert.rb +0 -8
  85. data/fixtures/merge/simple_case/copies/0123456789abcdef/1.zc +0 -6
  86. data/fixtures/merge/simple_case/copies/0123456789abcdef/scores.zc +0 -1
  87. data/fixtures/merge/simple_case/opts +0 -1
  88. data/fixtures/merge/unconfirmed_income/0123456789abcdef.z +0 -4
  89. data/fixtures/merge/unconfirmed_income/assert.rb +0 -8
  90. data/fixtures/merge/unconfirmed_income/copies/0123456789abcdef/1.zc +0 -6
  91. data/fixtures/merge/unconfirmed_income/copies/0123456789abcdef/scores.zc +0 -1
  92. data/fixtures/merge/unconfirmed_income/opts +0 -3
  93. data/fixtures/scripts/_head.sh +0 -72
  94. data/fixtures/scripts/calculate-scores.sh +0 -5
  95. data/fixtures/scripts/distribute-wallet.sh +0 -88
  96. data/fixtures/scripts/print-helps.sh +0 -9
  97. data/fixtures/scripts/pull-on-start.sh +0 -35
  98. data/fixtures/scripts/push-and-pull.sh +0 -46
  99. data/fixtures/scripts/redeploy-on-upgrade.sh +0 -40
  100. data/fixtures/scripts/spread-wallets.sh +0 -56
  101. data/renovate.json +0 -6
  102. data/test/commands/routines/test_audit.rb +0 -23
  103. data/test/commands/routines/test_gc.rb +0 -52
  104. data/test/commands/routines/test_reconcile.rb +0 -33
  105. data/test/commands/routines/test_reconnect.rb +0 -28
  106. data/test/commands/routines/test_retire.rb +0 -22
  107. data/test/commands/test_alias.rb +0 -58
  108. data/test/commands/test_calculate.rb +0 -22
  109. data/test/commands/test_clean.rb +0 -55
  110. data/test/commands/test_create.rb +0 -32
  111. data/test/commands/test_diff.rb +0 -43
  112. data/test/commands/test_fetch.rb +0 -144
  113. data/test/commands/test_invoice.rb +0 -32
  114. data/test/commands/test_list.rb +0 -29
  115. data/test/commands/test_merge.rb +0 -106
  116. data/test/commands/test_node.rb +0 -50
  117. data/test/commands/test_pay.rb +0 -203
  118. data/test/commands/test_propagate.rb +0 -33
  119. data/test/commands/test_pull.rb +0 -52
  120. data/test/commands/test_push.rb +0 -75
  121. data/test/commands/test_remote.rb +0 -247
  122. data/test/commands/test_remove.rb +0 -48
  123. data/test/commands/test_show.rb +0 -30
  124. data/test/commands/test_taxes.rb +0 -58
  125. data/test/fake_home.rb +0 -87
  126. data/test/node/fake_entrance.rb +0 -26
  127. data/test/node/fake_node.rb +0 -88
  128. data/test/node/test_async_entrance.rb +0 -85
  129. data/test/node/test_entrance.rb +0 -64
  130. data/test/node/test_farm.rb +0 -159
  131. data/test/node/test_farmers.rb +0 -58
  132. data/test/node/test_front.rb +0 -379
  133. data/test/node/test_nodup_entrance.rb +0 -31
  134. data/test/node/test_nospam_entrance.rb +0 -31
  135. data/test/node/test_safe_entrance.rb +0 -41
  136. data/test/node/test_spread_entrance.rb +0 -49
  137. data/test/node/test_sync_entrance.rb +0 -23
  138. data/test/node/test_trace.rb +0 -18
  139. data/test/test__helper.rb +0 -113
  140. data/test/test_age.rb +0 -37
  141. data/test/test_amount.rb +0 -62
  142. data/test/test_cached_wallets.rb +0 -55
  143. data/test/test_copies.rb +0 -127
  144. data/test/test_dir_items.rb +0 -72
  145. data/test/test_gem.rb +0 -23
  146. data/test/test_hands.rb +0 -51
  147. data/test/test_hexnum.rb +0 -18
  148. data/test/test_http.rb +0 -207
  149. data/test/test_hungry_wallets.rb +0 -72
  150. data/test/test_id.rb +0 -61
  151. data/test/test_json_page.rb +0 -29
  152. data/test/test_key.rb +0 -81
  153. data/test/test_metronome.rb +0 -71
  154. data/test/test_patch.rb +0 -160
  155. data/test/test_prefixes.rb +0 -31
  156. data/test/test_remotes.rb +0 -301
  157. data/test/test_signature.rb +0 -31
  158. data/test/test_size.rb +0 -21
  159. data/test/test_sync_wallets.rb +0 -39
  160. data/test/test_tax.rb +0 -153
  161. data/test/test_thread_pool.rb +0 -71
  162. data/test/test_tree_wallets.rb +0 -65
  163. data/test/test_txn.rb +0 -71
  164. data/test/test_upgrades.rb +0 -81
  165. data/test/test_verbose_thread.rb +0 -37
  166. data/test/test_version.rb +0 -17
  167. data/test/test_wallet.rb +0 -300
  168. data/test/test_wallets.rb +0 -67
  169. data/test/test_zold.rb +0 -81
  170. data/test/upgrades/test_delete_banned_wallets.rb +0 -29
  171. data/test/upgrades/test_protocol_up.rb +0 -24
@@ -1,72 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- # SPDX-FileCopyrightText: Copyright (c) 2018-2025 Zerocracy
4
- # SPDX-License-Identifier: MIT
5
-
6
- require 'webmock/minitest'
7
- require_relative 'test__helper'
8
- require_relative 'fake_home'
9
- require_relative '../lib/zold/key'
10
- require_relative '../lib/zold/thread_pool'
11
- require_relative '../lib/zold/wallets'
12
- require_relative '../lib/zold/hungry_wallets'
13
-
14
- # HungryWallets test.
15
- # Author:: Yegor Bugayenko (yegor256@gmail.com)
16
- # Copyright:: Copyright (c) 2018-2025 Zerocracy
17
- # License:: MIT
18
- class TestHungryWallets < Zold::Test
19
- def test_pulls_wallet
20
- FakeHome.new(log: fake_log).run do |home|
21
- id = Zold::Id.new
22
- get = stub_request(:get, "http://localhost:4096/wallet/#{id}").to_return(status: 404)
23
- remotes = home.remotes
24
- remotes.add('localhost', 4096)
25
- pool = Zold::ThreadPool.new('test', log: fake_log)
26
- wallets = Zold::HungryWallets.new(
27
- home.wallets, remotes, File.join(home.dir, 'copies'),
28
- pool, log: fake_log
29
- )
30
- wallets.acq(id) { |w| refute_predicate(w, :exists?) }
31
- pool.join(2)
32
- assert_requested(get, times: 1)
33
- end
34
- end
35
-
36
- def test_doesnt_pull_twice_if_not_found
37
- FakeHome.new(log: fake_log).run do |home|
38
- id = Zold::Id.new
39
- get = stub_request(:get, "http://localhost:4096/wallet/#{id}").to_return(status: 404)
40
- remotes = home.remotes
41
- remotes.add('localhost', 4096)
42
- pool = Zold::ThreadPool.new('test', log: fake_log)
43
- wallets = Zold::HungryWallets.new(
44
- home.wallets, remotes, File.join(home.dir, 'copies'),
45
- pool, log: fake_log
46
- )
47
- 3.times do
48
- wallets.acq(id) { |w| refute_predicate(w, :exists?) }
49
- sleep 0.2
50
- end
51
- pool.join(2)
52
- assert_requested(get, times: 1)
53
- end
54
- end
55
-
56
- def test_doesnt_pull_wallet_if_exists
57
- FakeHome.new(log: fake_log).run do |home|
58
- pool = Zold::ThreadPool.new('test', log: fake_log)
59
- remotes = home.remotes
60
- remotes.add('localhost', 4096)
61
- wallet = home.create_wallet
62
- get = stub_request(:get, "http://localhost:4096/wallet/#{wallet.id}").to_return(status: 200)
63
- wallets = Zold::HungryWallets.new(
64
- home.wallets, remotes, File.join(home.dir, 'copies'),
65
- pool, log: fake_log
66
- )
67
- wallets.acq(wallet.id) { |w| assert_predicate(w, :exists?) }
68
- pool.join(2)
69
- assert_requested(get, times: 0)
70
- end
71
- end
72
- end
data/test/test_id.rb DELETED
@@ -1,61 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- # SPDX-FileCopyrightText: Copyright (c) 2018-2025 Zerocracy
4
- # SPDX-License-Identifier: MIT
5
-
6
- require 'tmpdir'
7
- require_relative 'test__helper'
8
- require_relative '../lib/zold/id'
9
-
10
- # ID test.
11
- # Author:: Yegor Bugayenko (yegor256@gmail.com)
12
- # Copyright:: Copyright (c) 2018-2025 Zerocracy
13
- # License:: MIT
14
- class TestId < Zold::Test
15
- def test_generates_new_id
16
- 50.times do
17
- id = Zold::Id.new
18
- assert_equal 16, id.to_s.length
19
- end
20
- end
21
-
22
- def test_generates_different_ids
23
- before = ''
24
- 500.times do
25
- id = Zold::Id.new
26
- refute_equal id.to_s, before.to_s
27
- before = id
28
- end
29
- end
30
-
31
- def test_list_of_banned_ids_is_not_empty
32
- refute_empty(Zold::Id::BANNED)
33
- end
34
-
35
- def test_checks_for_root
36
- assert_predicate(Zold::Id::ROOT, :root?)
37
- end
38
-
39
- def test_generates_id_only_once
40
- id = Zold::Id.new
41
- before = id.to_s
42
- 5.times do
43
- assert_equal id.to_s, before
44
- end
45
- end
46
-
47
- def test_parses_id
48
- hex = 'ff01889402fe0954'
49
- id = Zold::Id.new(hex)
50
- assert_equal(id.to_s, hex, "#{id} is not equal to #{hex}")
51
- end
52
-
53
- def test_compares_two_ids_by_text
54
- id = Zold::Id.new.to_s
55
- assert_equal(Zold::Id.new(id), Zold::Id.new(id))
56
- end
57
-
58
- def test_compares_two_ids
59
- assert_equal Zold::Id.new(Zold::Id::ROOT.to_s), Zold::Id.new('0000000000000000')
60
- end
61
- end
@@ -1,29 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- # SPDX-FileCopyrightText: Copyright (c) 2018-2025 Zerocracy
4
- # SPDX-License-Identifier: MIT
5
-
6
- require_relative 'test__helper'
7
- require_relative '../lib/zold/json_page'
8
-
9
- # JsonPage test.
10
- # Author:: Yegor Bugayenko (yegor256@gmail.com)
11
- # Copyright:: Copyright (c) 2018-2025 Zerocracy
12
- # License:: MIT
13
- class TestJsonPage < Zold::Test
14
- def test_parses_json_page
15
- assert_equal(1, Zold::JsonPage.new('{"x": 1}').to_hash['x'])
16
- end
17
-
18
- def test_parses_broken_json_page
19
- assert_raises Zold::JsonPage::CantParse do
20
- Zold::JsonPage.new('not json').to_hash
21
- end
22
- end
23
-
24
- def test_parses_empty_page
25
- assert_raises Zold::JsonPage::CantParse do
26
- Zold::JsonPage.new('').to_hash
27
- end
28
- end
29
- end
data/test/test_key.rb DELETED
@@ -1,81 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- # SPDX-FileCopyrightText: Copyright (c) 2018-2025 Zerocracy
4
- # SPDX-License-Identifier: MIT
5
-
6
- require 'tmpdir'
7
- require 'openssl'
8
- require_relative 'test__helper'
9
- require_relative '../lib/zold/key'
10
-
11
- # Key test.
12
- # Author:: Yegor Bugayenko (yegor256@gmail.com)
13
- # Copyright:: Copyright (c) 2018-2025 Zerocracy
14
- # License:: MIT
15
- class TestKey < Zold::Test
16
- def test_reads_public_rsa
17
- key = Zold::Key.new(file: 'fixtures/id_rsa.pub')
18
- assert(key.to_pub.start_with?('MIICI'))
19
- assert(key.to_pub.end_with?('EAAQ=='))
20
- refute_includes(key.to_pub, "\n")
21
- assert(Zold::Key.new(text: key.to_pub).to_pub.start_with?('MIICI'))
22
- end
23
-
24
- def test_reads_private_rsa
25
- key = Zold::Key.new(file: 'fixtures/id_rsa')
26
- assert(key.to_pub.start_with?('MIIJJ'))
27
- assert(key.to_pub.end_with?('Sg=='))
28
- end
29
-
30
- def test_reads_public_root_rsa
31
- key = Zold::Key::ROOT
32
- assert(key.to_pub.start_with?('MIICIjANBgkqhkiG9'))
33
- assert(key.to_pub.end_with?('3Tp1UCAwEAAQ=='))
34
- end
35
-
36
- def test_signs_and_verifies
37
- pub = Zold::Key.new(file: 'fixtures/id_rsa.pub')
38
- pvt = Zold::Key.new(file: 'fixtures/id_rsa')
39
- text = 'How are you, my friend?'
40
- signature = pvt.sign(text)
41
- assert(pub.verify(signature, text))
42
- end
43
-
44
- def test_signs_and_verifies_with_random_key
45
- Dir.mktmpdir do |dir|
46
- key = OpenSSL::PKey::RSA.new(2048)
47
- file = File.join(dir, 'temp')
48
- File.write(file, key.public_key.to_s)
49
- pub = Zold::Key.new(file: file)
50
- File.write(file, key.to_s)
51
- pvt = Zold::Key.new(file: file)
52
- text = 'How are you doing, dude?'
53
- signature = pvt.sign(text)
54
- assert(pub.verify(signature, text))
55
- end
56
- end
57
-
58
- def test_read_public_keys
59
- Dir.new('fixtures/keys').grep(/\.pub$/).each do |f|
60
- path = "fixtures/keys/#{f}"
61
- pub = Zold::Key.new(file: path)
62
- assert_operator(pub.to_pub.length, :>, 100)
63
- end
64
- end
65
-
66
- def test_signs_with_real_keys
67
- Dir.new('fixtures/keys').grep(/[0-9]+$/).each do |f|
68
- pvt = Zold::Key.new(file: "fixtures/keys/#{f}")
69
- pub = Zold::Key.new(file: "fixtures/keys/#{f}.pub")
70
- text = 'How are you doing, my friend?'
71
- signature = pvt.sign(text)
72
- assert(pub.verify(signature, text))
73
- end
74
- end
75
-
76
- def test_parses_openssl_generated_keys
77
- rsa = OpenSSL::PKey::RSA.new(2048)
78
- Zold::Key.new(text: rsa.to_pem).to_s
79
- Zold::Key.new(text: rsa.public_key.to_pem).to_s
80
- end
81
- end
@@ -1,71 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- # SPDX-FileCopyrightText: Copyright (c) 2018-2025 Zerocracy
4
- # SPDX-License-Identifier: MIT
5
-
6
- require_relative 'test__helper'
7
- require_relative '../lib/zold/metronome'
8
-
9
- # Metronome test.
10
- # Author:: Yegor Bugayenko (yegor256@gmail.com)
11
- # Copyright:: Copyright (c) 2018-2025 Zerocracy
12
- # License:: MIT
13
- class TestMetronome < Zold::Test
14
- def test_start_and_stop
15
- metronome = Zold::Metronome.new(fake_log)
16
- list = []
17
- metronome.add(FakeRoutine.new(list))
18
- metronome.start do
19
- assert_wait { !list.empty? }
20
- end
21
- end
22
-
23
- def test_prints_to_text
24
- metronome = Zold::Metronome.new(fake_log)
25
- metronome.add(FakeRoutine.new([]))
26
- metronome.start do |m|
27
- refute_nil(m.to_text)
28
- end
29
- end
30
-
31
- def test_prints_empty_to_text
32
- metronome = Zold::Metronome.new(fake_log)
33
- metronome.start do |m|
34
- refute_nil(m.to_text)
35
- end
36
- end
37
-
38
- def test_continues_even_after_error
39
- metronome = Zold::Metronome.new(fake_log)
40
- routine = BrokenRoutine.new
41
- metronome.add(routine)
42
- metronome.start do
43
- assert_wait { routine.count >= 2 }
44
- assert_operator(routine.count, :>, 1)
45
- end
46
- end
47
-
48
- class FakeRoutine
49
- def initialize(list)
50
- @list = list
51
- end
52
-
53
- def exec(i)
54
- @list << i
55
- end
56
- end
57
-
58
- class BrokenRoutine
59
- attr_reader :count
60
-
61
- def initialize
62
- @count = 0
63
- end
64
-
65
- def exec(i)
66
- @count = i
67
- sleep 0.1
68
- raise
69
- end
70
- end
71
- end
data/test/test_patch.rb DELETED
@@ -1,160 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- # SPDX-FileCopyrightText: Copyright (c) 2018-2025 Zerocracy
4
- # SPDX-License-Identifier: MIT
5
-
6
- require_relative 'fake_home'
7
- require_relative 'test__helper'
8
- require_relative '../lib/zold/key'
9
- require_relative '../lib/zold/id'
10
- require_relative '../lib/zold/wallet'
11
- require_relative '../lib/zold/prefixes'
12
- require_relative '../lib/zold/amount'
13
- require_relative '../lib/zold/patch'
14
-
15
- # Patch test.
16
- # Author:: Yegor Bugayenko (yegor256@gmail.com)
17
- # Copyright:: Copyright (c) 2018-2025 Zerocracy
18
- # License:: MIT
19
- class TestPatch < Zold::Test
20
- def test_builds_patch
21
- FakeHome.new(log: fake_log).run do |home|
22
- first = home.create_wallet
23
- second = home.create_wallet
24
- third = home.create_wallet
25
- File.write(second.path, File.read(first.path))
26
- key = Zold::Key.new(file: 'fixtures/id_rsa')
27
- first.sub(Zold::Amount.new(zld: 39.0), "NOPREFIX@#{Zold::Id.new}", key)
28
- first.sub(Zold::Amount.new(zld: 11.0), "NOPREFIX@#{Zold::Id.new}", key)
29
- first.sub(Zold::Amount.new(zld: 3.0), "NOPREFIX@#{Zold::Id.new}", key)
30
- second.sub(Zold::Amount.new(zld: 44.0), "NOPREFIX@#{Zold::Id.new}", key)
31
- File.write(third.path, File.read(first.path))
32
- t = third.sub(Zold::Amount.new(zld: 10.0), "NOPREFIX@#{Zold::Id.new}", key)
33
- third.add(t.inverse(Zold::Id.new))
34
- patch = Zold::Patch.new(home.wallets, log: fake_log)
35
- patch.join(first) { false }
36
- patch.join(second) { false }
37
- patch.join(third) { false }
38
- assert(patch.save(first.path, overwrite: true, allow_negative_balance: true))
39
- assert_equal(Zold::Amount.new(zld: -53.0), first.balance)
40
- end
41
- end
42
-
43
- def test_rejects_fake_positives
44
- FakeHome.new(log: fake_log).run do |home|
45
- first = home.create_wallet
46
- second = home.create_wallet
47
- File.write(second.path, File.read(first.path))
48
- second.add(Zold::Txn.new(1, Time.now, Zold::Amount.new(zld: 11.0), 'NOPREFIX', Zold::Id.new, 'fake'))
49
- patch = Zold::Patch.new(home.wallets, log: fake_log)
50
- patch.join(first) { false }
51
- patch.join(second) { false }
52
- refute(patch.save(first.path, overwrite: true))
53
- first.flush
54
- assert_equal(Zold::Amount::ZERO, first.balance)
55
- end
56
- end
57
-
58
- def test_accepts_negative_balance_in_root_wallet
59
- FakeHome.new(log: fake_log).run do |home|
60
- first = home.create_wallet(Zold::Id::ROOT)
61
- second = home.create_wallet
62
- File.write(second.path, File.read(first.path))
63
- amount = Zold::Amount.new(zld: 333.0)
64
- key = Zold::Key.new(file: 'fixtures/id_rsa')
65
- second.sub(amount, "NOPREFIX@#{Zold::Id.new}", key)
66
- patch = Zold::Patch.new(home.wallets, log: fake_log)
67
- patch.join(first) { false }
68
- patch.join(second) { false }
69
- assert(patch.save(first.path, overwrite: true))
70
- first.flush
71
- assert_equal(amount * -1, first.balance)
72
- end
73
- end
74
-
75
- def test_merges_similar_ids_but_different_signs
76
- FakeHome.new(log: fake_log).run do |home|
77
- first = home.create_wallet(Zold::Id::ROOT)
78
- second = home.create_wallet
79
- File.write(second.path, File.read(first.path))
80
- key = Zold::Key.new(file: 'fixtures/id_rsa')
81
- second.sub(Zold::Amount.new(zld: 7.0), "NOPREFIX@#{Zold::Id.new}", key)
82
- first.add(
83
- Zold::Txn.new(
84
- 1, Time.now, Zold::Amount.new(zld: 9.0),
85
- Zold::Prefixes.new(first).create, Zold::Id.new, 'fake'
86
- )
87
- )
88
- patch = Zold::Patch.new(home.wallets, log: fake_log)
89
- patch.join(first) { false }
90
- patch.join(second) { false }
91
- assert(patch.save(first.path, overwrite: true))
92
- first.flush
93
- assert_equal(Zold::Amount.new(zld: 2.0).to_s, first.balance.to_s)
94
- end
95
- end
96
-
97
- def test_merges_fragmented_parts
98
- FakeHome.new(log: fake_log).run do |home|
99
- first = home.create_wallet(Zold::Id::ROOT)
100
- second = home.create_wallet
101
- File.write(second.path, File.read(first.path))
102
- key = Zold::Key.new(file: 'fixtures/id_rsa')
103
- start = Time.parse('2017-07-19T21:24:51Z')
104
- first.add(
105
- Zold::Txn.new(
106
- 1, start, Zold::Amount.new(zld: -2.0),
107
- 'NOPREFIX', Zold::Id.new, 'first payment'
108
- ).signed(key, first.id)
109
- )
110
- second.add(
111
- Zold::Txn.new(
112
- 2, start + 1, Zold::Amount.new(zld: -2.0),
113
- 'NOPREFIX', Zold::Id.new, 'second payment'
114
- ).signed(key, first.id)
115
- )
116
- first.add(
117
- Zold::Txn.new(
118
- 3, start + 2, Zold::Amount.new(zld: -2.0),
119
- 'NOPREFIX', Zold::Id.new, 'third payment'
120
- ).signed(key, first.id)
121
- )
122
- patch = Zold::Patch.new(home.wallets, log: fake_log)
123
- patch.join(first) { false }
124
- patch.join(second) { false }
125
- assert(patch.save(first.path, overwrite: true))
126
- first.flush
127
- assert_equal(3, first.txns.count)
128
- assert_equal(Zold::Amount.new(zld: -6.0).to_s, first.balance.to_s)
129
- end
130
- end
131
-
132
- def test_protocols_new_txns
133
- FakeHome.new(log: fake_log).run do |home|
134
- first = home.create_wallet(Zold::Id::ROOT)
135
- second = home.create_wallet
136
- File.write(second.path, File.read(first.path))
137
- amount = Zold::Amount.new(zld: 333.0)
138
- key = Zold::Key.new(file: 'fixtures/id_rsa')
139
- target = Zold::Id.new
140
- second.sub(amount, "NOPREFIX@#{target}", key, 'some details')
141
- second.sub(amount * 2, "NOPREFIX@#{target}", key)
142
- patch = Zold::Patch.new(home.wallets, log: fake_log)
143
- patch.legacy(first)
144
- Tempfile.open do |f|
145
- patch.join(second, ledger: f.path) { false }
146
- lines = File.read(f).split("\n")
147
- assert_equal(2, lines.count)
148
- parts = lines[0].split(';')
149
- refute_nil(Zold::Txn.parse_time(parts[0]))
150
- assert_equal(1, parts[1].to_i)
151
- refute_nil(Zold::Txn.parse_time(parts[2]))
152
- assert_equal(Zold::Id::ROOT.to_s, parts[3])
153
- assert_equal(target.to_s, parts[4])
154
- assert_equal(amount, Zold::Amount.new(zents: parts[5].to_i))
155
- assert_equal('NOPREFIX', parts[6])
156
- assert_equal('some details', parts[7])
157
- end
158
- end
159
- end
160
- end
@@ -1,31 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- # SPDX-FileCopyrightText: Copyright (c) 2018-2025 Zerocracy
4
- # SPDX-License-Identifier: MIT
5
-
6
- require 'tmpdir'
7
- require_relative 'fake_home'
8
- require_relative '../lib/zold/key'
9
- require_relative '../lib/zold/id'
10
- require_relative '../lib/zold/wallet'
11
- require_relative '../lib/zold/prefixes'
12
-
13
- # Prefixes test.
14
- # Author:: Yegor Bugayenko (yegor256@gmail.com)
15
- # Copyright:: Copyright (c) 2018-2025 Zerocracy
16
- # License:: MIT
17
- class TestPrefixes < Zold::Test
18
- def test_creates_and_validates
19
- FakeHome.new(log: fake_log).run do |home|
20
- wallet = home.create_wallet
21
- prefixes = Zold::Prefixes.new(wallet)
22
- (8..32).each do |len|
23
- 50.times do
24
- prefix = prefixes.create(len)
25
- assert_equal(len, prefix.length)
26
- assert(wallet.prefix?(prefix), "Prefix '#{prefix}' not found")
27
- end
28
- end
29
- end
30
- end
31
- end