"""When no language model can be reached (usage limits on every key and model), the proofread still delivers the basic corrections and says the full check is still to be done; it does not fail. Models are replaced by fakes.""" import time import pytest from docx import Document import detector as D import fluency as FL import groqai as G import humanizer as H import meaning as MEANING import proofread as PR TEXT = ("The model was trained on the the full dataset of 12,500 images and it reached an accuracy of 96.3% [4]. " "The results was compared with a baseline that used the same data and the same split of the samples.") @pytest.fixture def no_llm(monkeypatch, tmp_path): monkeypatch.setattr(G, "KEYS", ["k1"]) monkeypatch.setattr(G, "_KEY_STATE", [dict(until=0.0, calls=0, err="", tok_left=None, tok_reset=0.0, tok_limit=None, inflight=0, tokens=0)]) monkeypatch.setattr(G, "ENABLED", True) monkeypatch.setattr(G, "OPENAI_KEY", "") monkeypatch.setattr(G, "_down_until", time.time() + 9999) # every key and model at its limit monkeypatch.setattr(D, "score_texts", lambda texts: [0.0] * len(texts)) monkeypatch.setattr(H, "_detector_scores", lambda texts: [0.0] * len(texts)) monkeypatch.setattr(FL, "scores", lambda texts: [0.9] * len(texts)) monkeypatch.setattr(MEANING, "similarities", lambda pairs: [0.95] * len(pairs)) monkeypatch.setattr(PR, "MODE", "batched") import lt_grammar as LT monkeypatch.setattr(LT, "MODE", "off") d = Document() d.add_paragraph(TEXT) path = tmp_path / "paper_humanized.docx" d.save(str(path)) return str(path) def test_basic_proofread_instead_of_an_error(no_llm): res = PR.proofread_docx(no_llm) assert res["limited"] is True assert "Basic proofread only" in res["note"] and "NOT been done yet" in res["note"] out = Document(res["path"]).paragraphs[0].text assert "the the" not in out # the rule-based correction was still made assert "12,500" in out and "96.3%" in out and "[4]" in out def test_the_error_can_be_restored(no_llm, monkeypatch): monkeypatch.setattr(PR, "BASIC_FALLBACK", False) with pytest.raises(G.Unavailable): PR.proofread_docx(no_llm)