Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
18.75% covered (danger)
18.75%
3 / 16
20.00% covered (danger)
20.00%
1 / 5
CRAP
0.00% covered (danger)
0.00%
0 / 1
PageConfigurationLoader
18.75% covered (danger)
18.75%
3 / 16
20.00% covered (danger)
20.00%
1 / 5
63.64
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
 makeTitle
0.00% covered (danger)
0.00%
0 / 6
0.00% covered (danger)
0.00%
0 / 1
30
 loadTaskTypesConfig
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 1
2
 loadTopicsConfig
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 1
2
 loadTopics
100.00% covered (success)
100.00%
3 / 3
100.00% covered (success)
100.00%
1 / 1
2
1<?php
2
3namespace GrowthExperiments\NewcomerTasks\ConfigurationLoader;
4
5use GrowthExperiments\Config\WikiPageConfigLoader;
6use GrowthExperiments\NewcomerTasks\TaskType\TaskTypeHandlerRegistry;
7use GrowthExperiments\Util;
8use LogicException;
9use MediaWiki\Linker\LinkTarget;
10use MediaWiki\Title\TitleFactory;
11
12class PageConfigurationLoader extends AbstractDataConfigurationLoader {
13
14    private TitleFactory $titleFactory;
15    private WikiPageConfigLoader $configLoader;
16
17    /** @var LinkTarget|string */
18    private $taskConfigurationPage;
19
20    /** @var LinkTarget|string|null */
21    private $topicConfigurationPage;
22
23    /**
24     * @param ConfigurationValidator $configurationValidator
25     * @param TaskTypeHandlerRegistry $taskTypeHandlerRegistry
26     * @param string $topicType
27     * @param TitleFactory $titleFactory
28     * @param WikiPageConfigLoader $configLoader
29     * @param string|LinkTarget $taskConfigurationPage Wiki page to load task configuration from
30     *   (local or interwiki).
31     * @param string|LinkTarget|null $topicConfigurationPage Wiki page to load task configuration from
32     *   (local or interwiki). Can be omitted, in which case topic matching will be disabled.
33     */
34    public function __construct(
35        ConfigurationValidator $configurationValidator,
36        TaskTypeHandlerRegistry $taskTypeHandlerRegistry,
37        string $topicType,
38        TitleFactory $titleFactory,
39        WikiPageConfigLoader $configLoader,
40        $taskConfigurationPage,
41        $topicConfigurationPage
42    ) {
43        parent::__construct( $configurationValidator, $taskTypeHandlerRegistry, $topicType );
44
45        $this->titleFactory = $titleFactory;
46        $this->configLoader = $configLoader;
47        $this->taskConfigurationPage = $taskConfigurationPage;
48        $this->topicConfigurationPage = $topicConfigurationPage;
49    }
50
51    /**
52     * @param string|LinkTarget|null $target
53     * @return LinkTarget|null
54     */
55    private function makeTitle( $target ) {
56        if ( is_string( $target ) ) {
57            $target = $this->titleFactory->newFromText( $target );
58        }
59        if ( $target && !$target->isExternal() && !$target->inNamespace( NS_MEDIAWIKI ) ) {
60            Util::logException( new LogicException( 'Configuration page not in NS_MEDIAWIKI' ),
61                [ 'title' => $target->__toString() ] );
62        }
63        return $target;
64    }
65
66    /**
67     * @inheritDoc
68     */
69    protected function loadTaskTypesConfig() {
70        return $this->configLoader->load( $this->makeTitle( $this->taskConfigurationPage ) );
71    }
72
73    /**
74     * @inheritDoc
75     */
76    protected function loadTopicsConfig() {
77        return $this->configLoader->load( $this->makeTitle( $this->topicConfigurationPage ) );
78    }
79
80    /**
81     * @inheritDoc
82     */
83    public function loadTopics() {
84        if ( $this->topicConfigurationPage === null ) {
85            // NOTE: This has to be here, rather than loadTopicsConfig(), as empty data does not
86            // pass validation tests in the parent.
87            return [];
88        }
89
90        return parent::loadTopics();
91    }
92}