describe BillSignatureService do describe ".sign_operations" do let(:date) { Date.today } let(:operations_hash) { [['1', 'hash1'], ['2', 'hash2']] } let(:operations) do operations_hash .map { |id, digest| DossierOperationLog.new(id:, digest:, operation: 'accepter') } end let(:timestamp) { File.read('spec/fixtures/files/bill_signature/signature.der') } subject { BillSignatureService.sign_operations(operations, date) } before do DossierOperationLog.where(id: [1, 2]).destroy_all expect(Certigna::API).to receive(:timestamp).and_return(timestamp) end context "when everything is fine" do it do expect { subject }.not_to raise_error expect(BillSignature.count).to eq(1) end end context "when the digest does not match with the pre recorded timestamp token" do let(:operations_hash) { [['1', 'hash1'], ['2', 'hash3']] } it do expect { subject }.to raise_error(/La validation a échoué : Le champ « signature » ne correspond pas à l’empreinte/) expect(BillSignature.count).to eq(0) end end context "when the timestamp token cannot be verified by openssl" do let(:timestamp) do File.read('spec/fixtures/files/bill_signature/signature.der').tap { |s| s[-1] = 'd' } end it do expect { subject }.to raise_error(/openssl verification failed/) expect(BillSignature.count).to eq(0) end end end end