#!/usr/bin/env ruby # frozen_string_literal: true require 'json' require 'open3' EXE = File.expand_path('exe/referator', __dir__).freeze RAW_REFS = { self: { foo: { 'category' => 'self', 'id' => '/blog/foo', 'slug' => 'blog-foo', 'text' => 'Foo', }.freeze, bar: { 'category' => 'self', 'id' => '/blog/bar', 'slug' => 'blog-bar', 'text' => 'Bar', }.freeze, }.freeze, link: { example_com: { 'category' => 'link', 'id' => 'example_com', 'slug' => 'example-com', 'url' => 'https://example.com', 'text' => 'Example Domain', }.freeze, causa_arcana_com: { 'category' => 'link', 'id' => 'causa_arcana_com', 'slug' => 'causa-arcana-com', 'url' => 'https://causa-arcana.com', 'text' => 'Causa Arcana', }.freeze, }.freeze, }.freeze REFS = { self: { foo: RAW_REFS[:self][:foo].merge( 'anchor' => 'self-blog-foo', 'fragment' => '#self-blog-foo', ).freeze, bar: RAW_REFS[:self][:bar].merge( 'anchor' => 'self-blog-bar', 'fragment' => '#self-blog-bar', ).freeze, }.freeze, link: { example_com: RAW_REFS[:link][:example_com].merge( 'anchor' => 'link-example-com', 'fragment' => '#link-example-com', ).freeze, causa_arcana_com: RAW_REFS[:link][:causa_arcana_com].merge( 'anchor' => 'link-causa-arcana-com', 'fragment' => '#link-causa-arcana-com', ).freeze, }.freeze, }.freeze workdir = File.expand_path('test', __dir__).freeze @stdin, @stdout, @wait_thr = Open3.popen2 EXE, workdir, 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 = nil) @stdin.puts "#{name} #{data.to_json}" result = @stdout.gets.chomp if result.start_with? 'OK ' result = JSON.parse(result[3..]).freeze yield result if block_given? result elsif result.start_with? 'ERR ' raise "Error response: #{result[4..]}" else raise 'Invalid response' end end ################### # REGISTER_SCRIPT # ################### cmd :REGISTER_SCRIPT, { name: :render, vars: %i[template format notes note], args: ['./render.rb', { template: nil }, { format: nil }], stdin: ['{', '"notes":', { notes: nil }, ',', '"note":', { note: nil }, '}'] } ##################### # REGISTER_CATEGORY # ##################### cmd :REGISTER_CATEGORY, :self cmd :REGISTER_CATEGORY, :link ################### # REGISTER_FORMAT # ################### cmd :REGISTER_FORMAT, { name: :html, script: :render } cmd :REGISTER_FORMAT, { name: :json, script: :render } ################ # REGISTER_REF # ################ cmd :REGISTER_REF, RAW_REFS[:self][:foo] cmd :REGISTER_REF, RAW_REFS[:self][:bar] cmd :REGISTER_REF, RAW_REFS[:link][:example_com] cmd :REGISTER_REF, RAW_REFS[:link][:causa_arcana_com] ####### # REF # ####### cmd :REF, { category: :self, id: '/blog/foo' } do |result| raise unless result == REFS[:self][:foo] end cmd :REF, { category: :self, id: '/blog/bar' } do |result| raise unless result == REFS[:self][:bar] end cmd :REF, { category: :link, id: :example_com } do |result| raise unless result == REFS[:link][:example_com] end cmd :REF, { category: :link, id: :causa_arcana_com } do |result| raise unless result == REFS[:link][:causa_arcana_com] end ############ # MAKE_REF # ############ cmd :MAKE_REF, { category: :self, id: '/blog/foo' } do |result| raise unless result == REFS[:self][:foo] end cmd :MAKE_REF, { category: :link, id: :example_com } do |result| raise unless result == REFS[:link][:example_com] end cmd :MAKE_REF, { category: :self, id: '/blog/bar' } do |result| raise unless result == REFS[:self][:bar] end cmd :MAKE_REF, { category: :link, id: :causa_arcana_com } do |result| raise unless result == REFS[:link][:causa_arcana_com] end ################### # FETCH_FOOTNOTES # ################### cmd :FETCH_FOOTNOTES do |result| raise unless result == { 'self' => [ REFS[:self][:foo].merge('index' => 1), REFS[:self][:bar].merge('index' => 2), ], 'link' => [ REFS[:link][:example_com].merge('index' => 3), REFS[:link][:causa_arcana_com].merge('index' => 4), ], } end ############## # FETCH_NOTE # ############## cmd :FETCH_NOTE, { category: :self, id: '/blog/foo' } do |result| raise unless result == REFS[:self][:foo].merge('index' => 1) end cmd :FETCH_NOTE, { category: :self, id: '/blog/bar' } do |result| raise unless result == REFS[:self][:bar].merge('index' => 2) end cmd :FETCH_NOTE, { category: :link, id: :example_com } do |result| raise unless result == REFS[:link][:example_com].merge('index' => 3) end cmd :FETCH_NOTE, { category: :link, id: :causa_arcana_com } do |result| raise unless result == REFS[:link][:causa_arcana_com].merge('index' => 4) end #################### # RENDER_FOOTNOTES # #################### cmd :RENDER_FOOTNOTES, :html do |result| expected = <<~HTML

Self references

  1. Foo
  2. Bar

Link references

HTML raise unless result == expected end cmd :RENDER_FOOTNOTES, :json do |result| expected = <<~JSON { "self": [ { "index": 1, "category": "self", "id": "/blog/foo", "slug": "blog-foo", "anchor": "self-blog-foo", "fragment": "#self-blog-foo", "url": "/blog/foo.html", "text": "Foo" }, { "index": 2, "category": "self", "id": "/blog/bar", "slug": "blog-bar", "anchor": "self-blog-bar", "fragment": "#self-blog-bar", "url": "/blog/bar.html", "text": "Bar" } ], "link": [ { "index": 3, "category": "link", "id": "example_com", "slug": "example-com", "anchor": "link-example-com", "fragment": "#link-example-com", "url": "https://example.com", "text": "Example Domain" }, { "index": 4, "category": "link", "id": "causa_arcana_com", "slug": "causa-arcana-com", "anchor": "link-causa-arcana-com", "fragment": "#link-causa-arcana-com", "url": "https://causa-arcana.com", "text": "Causa Arcana" } ] } JSON raise unless result == expected end ################### # RENDER_CITE_SUP # ################### cmd( :RENDER_CITE_SUP, { format: :html, category: :self, id: '/blog/foo' }, ) do |result| raise unless result == "[1]\n" end cmd( :RENDER_CITE_SUP, { format: :html, category: :self, id: '/blog/bar' }, ) do |result| raise unless result == "[2]\n" end cmd( :RENDER_CITE_SUP, { format: :html, category: :link, id: :example_com }, ) do |result| raise unless result == "[3]\n" end cmd( :RENDER_CITE_SUP, { format: :html, category: :link, id: :causa_arcana_com }, ) do |result| raise unless result == "[4]\n" end