# frozen_string_literal: true

describe DiscourseAi::Completions::JsonStreamDecoder do
  let(:decoder) { DiscourseAi::Completions::JsonStreamDecoder.new }

  it "should be able to parse simple messages" do
    result = decoder << "data: #{{ hello: "world" }.to_json}"
    expect(result).to eq([{ hello: "world" }])
  end

  it "should handle anthropic mixed stlye streams" do
    stream = (<<~TEXT).split("|")
      event: |message_start|
      data: |{"hel|lo": "world"}|

      event: |message_start
      data: {"foo": "bar"}

      event: |message_start
      data: {"ba|z": "qux"|}

      [DONE]
    TEXT

    results = []
    stream.each { |chunk| results << (decoder << chunk) }

    expect(results.flatten.compact).to eq([{ hello: "world" }, { foo: "bar" }, { baz: "qux" }])
  end

  it "should be able to handle complex overlaps" do
    stream = (<<~TEXT).split("|")
      data: |{"hel|lo": "world"}

      data: {"foo": "bar"}

      data: {"ba|z": "qux"|}

      [DONE]
    TEXT

    results = []
    stream.each { |chunk| results << (decoder << chunk) }

    expect(results.flatten.compact).to eq([{ hello: "world" }, { foo: "bar" }, { baz: "qux" }])
  end
end
