119 lines
2.7 KiB
Ruby
Executable file
119 lines
2.7 KiB
Ruby
Executable file
#!/usr/bin/env ruby
|
|
# frozen_string_literal: true
|
|
|
|
require 'json'
|
|
require 'open3'
|
|
|
|
EXE = File.expand_path('exe/referator', __dir__).freeze
|
|
|
|
@stdin, @stdout, @wait_thr = Open3.popen2 EXE, chdir: __dir__
|
|
|
|
@stdin.sync = true
|
|
@stdout.sync = true
|
|
|
|
at_exit do
|
|
@stdin.close
|
|
@stdout.close
|
|
raise 'Script error' unless @wait_thr.value.success?
|
|
end
|
|
|
|
def cmd(name, data)
|
|
@stdin.puts "#{name} #{data.to_json}"
|
|
result = @stdout.gets.chomp
|
|
if result.start_with? 'OK '
|
|
JSON.parse(result[3..]).freeze
|
|
elsif result.start_with? 'ERR '
|
|
raise "Error response: #{result[4..]}"
|
|
else
|
|
raise 'Invalid response'
|
|
end
|
|
end
|
|
|
|
cmd :REGISTER_KIND, :self
|
|
cmd :REGISTER_KIND, :link
|
|
|
|
cmd :REGISTER_FORMAT, { name: :html,
|
|
args: ['test/footnotes.rb', { format: nil }],
|
|
stdin: { notes: nil } }
|
|
|
|
cmd :ADD_REF,
|
|
{ kind: :self,
|
|
id: '/blog/foo',
|
|
slug: 'blog-foo',
|
|
text: 'Foo' }
|
|
cmd :ADD_REF,
|
|
{ kind: :self,
|
|
id: '/blog/bar',
|
|
slug: 'blog-bar',
|
|
text: 'Bar' }
|
|
cmd :ADD_REF,
|
|
{ kind: :link,
|
|
id: :example_com,
|
|
slug: 'example-com',
|
|
url: 'https://example.com',
|
|
text: 'Example Domain' }
|
|
cmd :ADD_REF,
|
|
{ kind: :link,
|
|
id: :causa_arcana_com,
|
|
slug: 'causa-arcana-com',
|
|
url: 'https://causa-arcana.com',
|
|
text: 'Causa Arcana' }
|
|
|
|
cmd(:REF, { kind: :self, id: '/blog/foo' }).tap do |result|
|
|
expected = {
|
|
'kind' => 'self',
|
|
'id' => '/blog/foo',
|
|
'slug' => 'blog-foo',
|
|
'anchor' => 'self-blog-foo',
|
|
'fragment' => '#self-blog-foo',
|
|
'text' => 'Foo',
|
|
}
|
|
|
|
raise unless result == expected
|
|
end
|
|
cmd(:REF, { kind: :link, id: :example_com }).tap do |result|
|
|
expected = {
|
|
'kind' => 'link',
|
|
'id' => 'example_com',
|
|
'slug' => 'example-com',
|
|
'anchor' => 'link-example-com',
|
|
'fragment' => '#link-example-com',
|
|
'url' => 'https://example.com',
|
|
'text' => 'Example Domain',
|
|
}
|
|
|
|
raise unless result == expected
|
|
end
|
|
|
|
cmd :ADD_NOTE, { kind: :self, id: '/blog/foo' }
|
|
cmd :ADD_NOTE, { kind: :link, id: :example_com }
|
|
cmd :ADD_NOTE, { kind: :self, id: '/blog/bar' }
|
|
cmd :ADD_NOTE, { kind: :link, id: :causa_arcana_com }
|
|
|
|
cmd(:RENDER_FOOTNOTES, :html).tap do |result|
|
|
expected = <<~HTML.freeze
|
|
<h2>Self references</h2>
|
|
|
|
<ol>
|
|
<li id="self-blog-foo" value="1">
|
|
<a href="/blog/foo.html">Foo</a>
|
|
</li>
|
|
<li id="self-blog-bar" value="3">
|
|
<a href="/blog/bar.html">Bar</a>
|
|
</li>
|
|
</ol>
|
|
|
|
<h2>Link references</h2>
|
|
|
|
<ol>
|
|
<li id="link-example-com" value="2">
|
|
<a href="https://example.com">Example Domain</a>
|
|
</li>
|
|
<li id="link-causa-arcana-com" value="4">
|
|
<a href="https://causa-arcana.com">Causa Arcana</a>
|
|
</li>
|
|
</ol>
|
|
HTML
|
|
|
|
raise unless result == expected
|
|
end
|