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

describe('Conversations', () => {
  it('updates lastMessage even in race conditions with db', async () => {
    const ourNumber = '+15550000000';
    const ourUuid = window.getGuid();

    // Creating a fake conversation
    const conversation = new window.Whisper.Conversation({
      id: '8c45efca-67a4-4026-b990-9537d5d1a08f',
      e164: '+15551234567',
      uuid: '2f2734aa-f69d-4c1c-98eb-50eb0fc512d7',
      type: 'private',
    });

    const destinationE164 = '+15557654321';
    window.textsecure.storage.user.setNumberAndDeviceId(
      ourNumber,
      2,
      'my device'
    );
    window.textsecure.storage.user.setUuidAndDeviceId(ourUuid, 2);
    window.ConversationController._initialFetchComplete = true;

    // Creating a fake message
    const now = Date.now();
    let message = new window.Whisper.Message({
      attachments: [],
      body: 'bananas',
      conversationId: conversation.id,
      delivered: 1,
      delivered_to: [destinationE164],
      destination: destinationE164,
      expirationStartTimestamp: now,
      hasAttachments: 0,
      hasFileAttachments: 0,
      hasVisualMediaAttachments: 0,
      id: 'd8f2b435-e2ef-46e0-8481-07e68af251c6',
      received_at: now,
      recipients: [destinationE164],
      sent: true,
      sent_at: now,
      sent_to: [destinationE164],
      timestamp: now,
      type: 'outgoing',
    });

    // Saving to db and updating the convo's last message
    await window.Signal.Data.saveMessage(message.attributes, {
      forceSave: true,
      Message: window.Whisper.Message,
    });
    message = window.MessageController.register(message.id, message);
    await window.Signal.Data.saveConversation(conversation.attributes, {
      Conversation: window.Whisper.Conversation,
    });
    await conversation.updateLastMessage();

    // Should be set to bananas because that's the last message sent.
    assert.strictEqual(conversation.get('lastMessage'), 'bananas');

    // Erasing message contents (DOE)
    message.set({
      isErased: true,
      body: '',
      bodyRanges: undefined,
      attachments: [],
      quote: null,
      contact: [],
      sticker: null,
      preview: [],
    });

    // Not saving the message to db on purpose
    // to simulate that a save hasn't taken place yet.

    // Updating convo's last message, should pick it up from memory
    await conversation.updateLastMessage();

    assert.strictEqual(conversation.get('lastMessage'), '');
  });
});
