// Copyright 2021 Signal Messenger, LLC
// SPDX-License-Identifier: AGPL-3.0-only

import * as sinon from 'sinon';
import { getDefaultConversation } from '../../../test-both/helpers/getDefaultConversation';
import { Job } from '../../../jobs/Job';

import { addReportSpamJob } from '../../../jobs/helpers/addReportSpamJob';

describe('addReportSpamJob', () => {
  let getMessageServerGuidsForSpam: sinon.SinonStub;
  let jobQueue: { add: sinon.SinonStub };

  beforeEach(() => {
    getMessageServerGuidsForSpam = sinon.stub().resolves(['abc', 'xyz']);
    jobQueue = {
      add: sinon
        .stub()
        .callsFake(
          async data =>
            new Job<unknown>(
              'fake-job-id',
              Date.now(),
              'fake job queue type',
              data,
              Promise.resolve()
            )
        ),
    };
  });

  it('does nothing if the conversation lacks an E164', async () => {
    await addReportSpamJob({
      conversation: getDefaultConversation({ e164: undefined }),
      getMessageServerGuidsForSpam,
      jobQueue,
    });

    sinon.assert.notCalled(getMessageServerGuidsForSpam);
    sinon.assert.notCalled(jobQueue.add);
  });

  it("doesn't enqueue a job if there are no messages with server GUIDs", async () => {
    getMessageServerGuidsForSpam.resolves([]);

    await addReportSpamJob({
      conversation: getDefaultConversation(),
      getMessageServerGuidsForSpam,
      jobQueue,
    });

    sinon.assert.notCalled(jobQueue.add);
  });

  it('enqueues a job', async () => {
    const conversation = getDefaultConversation();

    await addReportSpamJob({
      conversation,
      getMessageServerGuidsForSpam,
      jobQueue,
    });

    sinon.assert.calledOnce(getMessageServerGuidsForSpam);
    sinon.assert.calledWith(getMessageServerGuidsForSpam, conversation.id);

    sinon.assert.calledOnce(jobQueue.add);
    sinon.assert.calledWith(jobQueue.add, {
      e164: conversation.e164,
      serverGuids: ['abc', 'xyz'],
    });
  });
});
