Files
discourse-hledger/spec/lib/hledger/journal_spec.rb
T

95 lines
2.3 KiB
Ruby

# frozen_string_literal: true
RSpec.describe Hledger::Journal do
def raw_with(journal)
"Intro\n\n```hledger\n#{journal}\n```\n\nOutro\n"
end
it "extracts a single fenced journal" do
result = described_class.extract(raw_with("2024-01-01 x\n a 1\n b -1"))
expect(result).to be_ok
expect(result.source).to include("2024-01-01 x")
end
it "returns :none when there is no journal" do
expect(described_class.extract("just text").error).to eq(:none)
end
it "returns :ambiguous for multiple journals" do
raw = <<~RAW
```hledger
2024-01-01 x
a 1
b -1
```
```hledger
2024-01-02 y
a 1
b -1
```
RAW
expect(described_class.extract(raw).error).to eq(:ambiguous)
end
it "rejects include directives" do
result = described_class.extract(raw_with("include /etc/hostname"))
expect(result.error).to eq(:include_not_allowed)
end
[
"include /etc/passwd",
"include ../foo",
"include ~/foo",
"include *.journal",
"include **/*",
" include foo",
"\tinclude foo",
"INCLUDE foo",
"!include foo",
"! include foo",
"! include foo",
].each do |directive|
it "rejects the include directive #{directive.inspect}" do
result = described_class.extract(raw_with(directive))
expect(result.error).to eq(:include_not_allowed)
end
end
it "allows the word include inside a transaction" do
result = described_class.extract(raw_with("2024-01-01 include the foo\n a 1\n b -1"))
expect(result).to be_ok
end
it "rejects oversized journals" do
SiteSetting.hledger_max_journal_bytes = 10
result = described_class.extract(raw_with("2024-01-01 xxxxxxxxxxxxxxxxxxxx"))
expect(result.error).to eq(:too_large)
ensure
SiteSetting.hledger_max_journal_bytes = 262_144
end
it "extracts a fence with trailing whitespace and a longer fence" do
raw = "Intro\n\n````hledger \n2024-01-01 x\n a 1\n b -1\n````\n\nOutro\n"
result = described_class.extract(raw)
expect(result).to be_ok
expect(result.source).to include("2024-01-01 x")
end
it "rejects invalid UTF-8" do
raw = "```hledger\n2024-01-01 \xFF\n```\n"
result = described_class.extract(raw)
expect(result.error).to eq(:invalid_encoding)
end
end