package com.doist.jobschedulercompat.job;

import com.doist.jobschedulercompat.JobInfo;
import com.doist.jobschedulercompat.JobScheduler;
import com.doist.jobschedulercompat.util.JobCreator;

import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.robolectric.RobolectricTestRunner;

import android.app.Application;
import android.content.BroadcastReceiver;
import android.content.Intent;

import java.util.List;
import java.util.concurrent.TimeUnit;

import androidx.test.core.app.ApplicationProvider;

import static org.hamcrest.Matchers.hasItem;
import static org.hamcrest.Matchers.hasSize;
import static org.hamcrest.Matchers.isA;
import static org.junit.Assert.assertThat;
import static org.robolectric.Shadows.shadowOf;

@RunWith(RobolectricTestRunner.class)
public class JobGcReceiverTest {
    private Application application;
    private JobStore jobStore;

    @Before
    public void setup() {
        application = ApplicationProvider.getApplicationContext();
        jobStore = JobStore.get(application);
    }

    @After
    public void teardown() {
        synchronized (JobStore.LOCK) {
            jobStore.clear();
        }
    }

    @Test
    public void testBootReceiverRegistered() {
        Intent intent = new Intent(Intent.ACTION_BOOT_COMPLETED);
        List<BroadcastReceiver> receivers = shadowOf(application).getReceiversForIntent(intent);
        assertThat(receivers, hasItem(isA(JobGcReceiver.class)));
    }

    @Test
    public void testNonPersistedJobsAreCleared() {
        JobScheduler jobScheduler = JobScheduler.get(application);
        jobScheduler.schedule(
                JobCreator.create(application)
                          .setRequiredNetworkType(JobInfo.NETWORK_TYPE_ANY)
                          .setPersisted(true)
                          .build());
        jobScheduler.schedule(
                JobCreator.create(application)
                          .setRequiredNetworkType(JobInfo.NETWORK_TYPE_ANY)
                          .setPersisted(false)
                          .build());
        jobScheduler.schedule(
                JobCreator.create(application)
                          .setPeriodic(TimeUnit.HOURS.toMillis(1))
                          .setPersisted(true)
                          .build());
        jobScheduler.schedule(
                JobCreator.create(application)
                          .setPeriodic(TimeUnit.HOURS.toMillis(1))
                          .setPersisted(false)
                          .build());

        assertThat(jobScheduler.getAllPendingJobs(), hasSize(4));

        application.sendBroadcast(new Intent(Intent.ACTION_BOOT_COMPLETED));

        assertThat(jobScheduler.getAllPendingJobs(), hasSize(2));
    }
}