# frozen_string_literal: true RSpec.describe DiscourseAi::AiBot::Tools::Tool do let :tool_class do described_class end let :corrupt_string do "\xC3\x28\xA0\xA1\xE2\x28\xA1\xE2\x82\x28\xF0\x28\x8C\xBC" end describe "#read_response_body" do class FakeResponse def initialize(chunk) @chunk = chunk end def read_body yield @chunk while true end end it "never returns a corrupt string" do response = FakeResponse.new(corrupt_string) result = tool_class.read_response_body(response, max_length: 100.bytes) expect(result.encoding).to eq(Encoding::UTF_8) expect(result.valid_encoding?).to eq(true) # scrubbing removes 7 chars expect(result.length).to eq(93) end it "returns correctly truncated strings" do response = FakeResponse.new("abc") result = tool_class.read_response_body(response, max_length: 10.bytes) expect(result.encoding).to eq(Encoding::UTF_8) expect(result.valid_encoding?).to eq(true) expect(result).to eq("abcabcabca") end end end