github.com/cozy/cozy-stack@v0.0.0-20240603063001-31110fa4cae1/model/job/broker_test.go (about)

     1  package job_test
     2  
     3  import (
     4  	"testing"
     5  	"time"
     6  
     7  	"github.com/cozy/cozy-stack/model/job"
     8  	"github.com/cozy/cozy-stack/pkg/config/config"
     9  	"github.com/cozy/cozy-stack/tests/testutils"
    10  	"github.com/stretchr/testify/assert"
    11  )
    12  
    13  func TestBrokerImplems(t *testing.T) {
    14  	assert.Implements(t, (*job.Broker)(nil), new(job.BrokerMock))
    15  }
    16  
    17  func TestBroker(t *testing.T) {
    18  	if testing.Short() {
    19  		t.Skip("an instance is required for this test: test skipped due to the use of --short flag")
    20  	}
    21  
    22  	config.UseTestFile(t)
    23  	setup := testutils.NewSetup(t, t.Name())
    24  	testInstance := setup.GetTestInstance()
    25  
    26  	t.Run("GetJobsBeforeDate", func(t *testing.T) {
    27  		// Create jobs
    28  		utc, err := time.LoadLocation("")
    29  		assert.NoError(t, err)
    30  
    31  		date1 := time.Date(2000, time.January, 1, 1, 1, 1, 1, utc)
    32  		job1 := &job.Job{
    33  			Domain:     testInstance.Domain,
    34  			Prefix:     testInstance.DBPrefix(),
    35  			WorkerType: "thumbnail",
    36  			TriggerID:  "foobar",
    37  			Manual:     false,
    38  			State:      job.Queued,
    39  			QueuedAt:   date1,
    40  		}
    41  		err = job1.Create()
    42  		assert.NoError(t, err)
    43  
    44  		date2 := time.Now()
    45  		job2 := &job.Job{
    46  			Domain:     testInstance.Domain,
    47  			Prefix:     testInstance.DBPrefix(),
    48  			WorkerType: "thumbnail",
    49  			TriggerID:  "foobar",
    50  			Manual:     false,
    51  			State:      job.Queued,
    52  			QueuedAt:   date2,
    53  		}
    54  		err = job2.Create()
    55  		assert.NoError(t, err)
    56  
    57  		date3 := time.Date(2100, time.January, 1, 1, 1, 1, 1, utc)
    58  		job3 := &job.Job{
    59  			Domain:     testInstance.Domain,
    60  			Prefix:     testInstance.DBPrefix(),
    61  			WorkerType: "thumbnail",
    62  			TriggerID:  "foobar",
    63  			Manual:     false,
    64  			State:      job.Queued,
    65  			QueuedAt:   date3,
    66  		}
    67  		err = job3.Create()
    68  		assert.NoError(t, err)
    69  
    70  		allJobs, err := job.GetAllJobs(testInstance)
    71  		assert.NoError(t, err)
    72  		assert.Equal(t, 3, len(allJobs))
    73  
    74  		jobs := job.FilterJobsBeforeDate(allJobs, time.Now())
    75  
    76  		// We should have only 2 jobs :
    77  		// The first has been queued in the past: OK
    78  		// The second has just been queued: OK
    79  		// The third is queued in the future: NOK
    80  		assert.Equal(t, 2, len(jobs))
    81  	})
    82  
    83  	t.Run("GetLastsJobs", func(t *testing.T) {
    84  		allJobs, err := job.GetAllJobs(testInstance)
    85  		assert.NoError(t, err)
    86  		j, err := job.GetLastsJobs(allJobs, "thumbnail")
    87  		assert.NoError(t, err)
    88  		assert.Equal(t, 3, len(j))
    89  
    90  		// Add a job
    91  		myJob := &job.Job{
    92  			Domain:     testInstance.Domain,
    93  			Prefix:     testInstance.DBPrefix(),
    94  			WorkerType: "thumbnail",
    95  			TriggerID:  "foobar",
    96  			Manual:     false,
    97  			State:      job.Running,
    98  			QueuedAt:   time.Now(),
    99  		}
   100  		err = myJob.Create()
   101  		assert.NoError(t, err)
   102  		allJobs, err = job.GetAllJobs(testInstance)
   103  		assert.NoError(t, err)
   104  		j, err = job.GetLastsJobs(allJobs, "thumbnail")
   105  		assert.NoError(t, err)
   106  		assert.Equal(t, 4, len(j))
   107  
   108  		// Add a job in another queue
   109  		myJob = &job.Job{
   110  			Domain:     testInstance.Domain,
   111  			Prefix:     testInstance.DBPrefix(),
   112  			WorkerType: "konnector",
   113  			TriggerID:  "foobar",
   114  			Manual:     false,
   115  			State:      job.Errored,
   116  			QueuedAt:   time.Now(),
   117  		}
   118  		err = myJob.Create()
   119  		assert.NoError(t, err)
   120  		allJobs, err = job.GetAllJobs(testInstance)
   121  		assert.NoError(t, err)
   122  		j, err = job.GetLastsJobs(allJobs, "thumbnail")
   123  		assert.NoError(t, err)
   124  		assert.Equal(t, 4, len(j))
   125  		allJobs, err = job.GetAllJobs(testInstance)
   126  		assert.NoError(t, err)
   127  		j, err = job.GetLastsJobs(allJobs, "konnector")
   128  		assert.NoError(t, err)
   129  		assert.Equal(t, 1, len(j))
   130  
   131  		// No jobs
   132  		allJobs, err = job.GetAllJobs(testInstance)
   133  		assert.NoError(t, err)
   134  		j, err = job.GetLastsJobs(allJobs, "foobar")
   135  		assert.NoError(t, err)
   136  		assert.Equal(t, 0, len(j))
   137  
   138  		// Add a job in the future and assert it is the first one returned
   139  		utc, err := time.LoadLocation("")
   140  		assert.NoError(t, err)
   141  		futureDate := time.Date(2200, time.January, 1, 1, 1, 1, 1, utc)
   142  		myJob = &job.Job{
   143  			Domain:     testInstance.Domain,
   144  			Prefix:     testInstance.DBPrefix(),
   145  			WorkerType: "thumbnail",
   146  			TriggerID:  "foobar",
   147  			Manual:     false,
   148  			State:      job.Errored,
   149  			QueuedAt:   futureDate,
   150  		}
   151  		err = myJob.Create()
   152  		assert.NoError(t, err)
   153  
   154  		allJobs, err = job.GetAllJobs(testInstance)
   155  		assert.NoError(t, err)
   156  		j, err = job.GetLastsJobs(allJobs, "thumbnail")
   157  		assert.NoError(t, err)
   158  
   159  		// One running, one errored, three queued
   160  		assert.Equal(t, 5, len(j))
   161  		assert.Equal(t, futureDate.String(), j[len(j)-1].QueuedAt.String())
   162  		assert.Equal(t, job.Errored, j[len(j)-1].State)
   163  	})
   164  }