95 lines
2.3 KiB
Ruby
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
|