Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
0.00% covered (danger)
0.00%
0 / 23
0.00% covered (danger)
0.00%
0 / 7
CRAP
0.00% covered (danger)
0.00%
0 / 1
ImageRecommendationBaseTaskTypeHandler
0.00% covered (danger)
0.00%
0 / 23
0.00% covered (danger)
0.00%
0 / 7
132
0.00% covered (danger)
0.00%
0 / 1
 __construct
0.00% covered (danger)
0.00%
0 / 5
0.00% covered (danger)
0.00%
0 / 1
2
 getId
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 1
2
 getChangeTags
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 1
2
 getRecommendationProvider
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 1
2
 getSubmissionHandler
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 1
2
 validateTaskTypeConfiguration
0.00% covered (danger)
0.00%
0 / 11
0.00% covered (danger)
0.00%
0 / 1
20
 getTaskTypeIdByChangeTagName
0.00% covered (danger)
0.00%
0 / 3
0.00% covered (danger)
0.00%
0 / 1
6
1<?php
2
3namespace GrowthExperiments\NewcomerTasks\TaskType;
4
5use GrowthExperiments\NewcomerTasks\AddImage\AddImageSubmissionHandler;
6use GrowthExperiments\NewcomerTasks\AddImage\ImageRecommendationProvider;
7use GrowthExperiments\NewcomerTasks\ConfigurationLoader\ConfigurationValidator;
8use LogicException;
9use MediaWiki\Title\TitleParser;
10use StatusValue;
11use Wikimedia\Assert\Assert;
12
13abstract class ImageRecommendationBaseTaskTypeHandler extends StructuredTaskTypeHandler {
14
15    // This weird hack is the only way in PHP to have abstract constants.
16    public const ID = self::ID;
17    public const TASK_TYPE_ID = self::TASK_TYPE_ID;
18    public const CHANGE_TAG = self::CHANGE_TAG;
19    public const WEIGHTED_TAG_PREFIX = self::WEIGHTED_TAG_PREFIX;
20
21    protected ImageRecommendationProvider $recommendationProvider;
22    protected AddImageSubmissionHandler $submissionHandler;
23
24    /**
25     * @param ConfigurationValidator $configurationValidator
26     * @param TitleParser $titleParser
27     * @param ImageRecommendationProvider $recommendationProvider
28     * @param AddImageSubmissionHandler $submissionHandler
29     */
30    public function __construct(
31        ConfigurationValidator $configurationValidator,
32        TitleParser $titleParser,
33        ImageRecommendationProvider $recommendationProvider,
34        AddImageSubmissionHandler $submissionHandler
35    ) {
36        parent::__construct( $configurationValidator, $titleParser );
37        Assert::parameterType( ImageRecommendationProvider::class, $recommendationProvider,
38            '$recommendationProvider' );
39        $this->recommendationProvider = $recommendationProvider;
40        $this->submissionHandler = $submissionHandler;
41    }
42
43    /** @inheritDoc */
44    public function getId(): string {
45        return static::ID;
46    }
47
48    /** @inheritDoc */
49    public function getChangeTags( ?string $taskType = null ): array {
50        return [ TaskTypeHandler::NEWCOMER_TASK_TAG, static::CHANGE_TAG ];
51    }
52
53    /** @inheritDoc */
54    public function getRecommendationProvider(): ImageRecommendationProvider {
55        return $this->recommendationProvider;
56    }
57
58    /** @inheritDoc */
59    public function getSubmissionHandler(): AddImageSubmissionHandler {
60        return $this->submissionHandler;
61    }
62
63    /** @inheritDoc */
64    public function validateTaskTypeConfiguration( string $taskTypeId, array $config ): StatusValue {
65        $status = parent::validateTaskTypeConfiguration( $taskTypeId, $config );
66        if ( !$status->isOK() ) {
67            return $status;
68        }
69        foreach ( [
70            ImageRecommendationBaseTaskType::FIELD_MAX_TASKS_PER_DAY,
71            ImageRecommendationBaseTaskType::FIELD_MINIMUM_CAPTION_CHARACTER_LENGTH,
72        ] as $field ) {
73            if ( array_key_exists( $field, $config ) ) {
74                $status->merge( $this->configurationValidator->validateInteger(
75                    $config, $field, $taskTypeId, 1 ) );
76            }
77        }
78        return $status;
79    }
80
81    /** @inheritDoc */
82    public function getTaskTypeIdByChangeTagName( string $changeTagName ): ?string {
83        if ( $changeTagName !== static::CHANGE_TAG ) {
84            throw new LogicException( "\"$changeTagName\" is not a valid change tag name for " . static::class );
85        }
86        return static::TASK_TYPE_ID;
87    }
88
89}