1 # Pleroma: A lightweight social networking server
2 # Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/>
3 # SPDX-License-Identifier: AGPL-3.0-only
5 defmodule Pleroma.JobsTest do
6 use ExUnit.Case, async: true
13 queues: Enum.into([Jobs.create_queue(:testing)], %{}),
20 test "creates queue" do
21 queue = Jobs.create_queue(:foobar)
23 assert {:foobar, set} = queue
24 assert :set == elem(set, 0) |> elem(0)
27 test "enqueues an element according to priority" do
28 queue = [%{item: 1, priority: 2}]
30 new_queue = Jobs.enqueue_sorted(queue, 2, 1)
31 assert new_queue == [%{item: 2, priority: 1}, %{item: 1, priority: 2}]
33 new_queue = Jobs.enqueue_sorted(queue, 2, 3)
34 assert new_queue == [%{item: 1, priority: 2}, %{item: 2, priority: 3}]
37 test "pop first item" do
38 queue = [%{item: 2, priority: 1}, %{item: 1, priority: 2}]
40 assert {2, [%{item: 1, priority: 2}]} = Jobs.queue_pop(queue)
43 test "enqueue a job", %{state: state} do
44 assert {:noreply, new_state} =
45 Jobs.handle_cast({:enqueue, :testing, WorkerMock, [:test_job, :foo, :bar], 3}, state)
47 assert %{queues: %{testing: {running_jobs, []}}, refs: _} = new_state
48 assert :sets.size(running_jobs) == 1
49 assert [ref] = :sets.to_list(running_jobs)
50 assert %{refs: %{^ref => :testing}} = new_state
53 test "max jobs setting", %{state: state} do
54 max_jobs = Pleroma.Config.get([Jobs, :testing, :max_jobs])
57 Enum.reduce(1..(max_jobs + 1), {:noreply, state}, fn _, {:noreply, state} ->
58 Jobs.handle_cast({:enqueue, :testing, WorkerMock, [:test_job, :foo, :bar], 3}, state)
64 {running_jobs, [%{item: {WorkerMock, [:test_job, :foo, :bar]}, priority: 3}]}
68 assert :sets.size(running_jobs) == max_jobs
71 test "remove job after it finished", %{state: state} do
72 {:noreply, new_state} =
73 Jobs.handle_cast({:enqueue, :testing, WorkerMock, [:test_job, :foo, :bar], 3}, state)
75 %{queues: %{testing: {running_jobs, []}}} = new_state
76 [ref] = :sets.to_list(running_jobs)
78 assert {:noreply, %{queues: %{testing: {running_jobs, []}}, refs: %{}}} =
79 Jobs.handle_info({:DOWN, ref, :process, nil, nil}, new_state)
81 assert :sets.size(running_jobs) == 0