2020package org .sonar .plugins .python .pylint ;
2121
2222import java .io .File ;
23- import java .nio .file .Paths ;
23+ import java .nio .charset .StandardCharsets ;
24+ import java .util .List ;
25+ import java .util .concurrent .atomic .AtomicBoolean ;
2426import org .junit .Before ;
2527import org .junit .Test ;
26- import org .mockito .Mockito ;
27- import org .sonar .api .batch .SensorContext ;
2828import org .sonar .api .batch .fs .internal .DefaultFileSystem ;
2929import org .sonar .api .batch .fs .internal .DefaultInputFile ;
30+ import org .sonar .api .batch .fs .internal .FileMetadata ;
3031import org .sonar .api .batch .rule .ActiveRules ;
3132import org .sonar .api .batch .rule .internal .ActiveRulesBuilder ;
32- import org .sonar .api .component . ResourcePerspectives ;
33+ import org .sonar .api .batch . sensor . internal . SensorContextTester ;
3334import org .sonar .api .config .MapSettings ;
3435import org .sonar .api .config .Settings ;
35- import org .sonar .api .issue .Issuable ;
36- import org .sonar .api .resources .Project ;
3736import org .sonar .api .rule .RuleKey ;
3837import org .sonar .plugins .python .Python ;
3938
4039import static org .assertj .core .api .Assertions .assertThat ;
41- import static org .mockito .Matchers .any ;
4240import static org .mockito .Mockito .mock ;
43- import static org .mockito .Mockito .times ;
44- import static org .mockito .Mockito .verify ;
45- import static org .mockito .Mockito .when ;
4641
4742public class PylintImportSensorTest {
43+
44+ private File baseDir = new File ("src/test/resources/org/sonar/plugins/python/pylint" );
4845 private Settings settings ;
4946 private DefaultFileSystem fileSystem ;
5047 private ActiveRules activeRules ;
51- private SensorContext context ;
5248 private DefaultInputFile inputFile ;
5349
5450 @ Before
5551 public void init () {
5652 settings = new MapSettings ();
5753 settings .setProperty (PylintImportSensor .REPORT_PATH_KEY , "pylint-report.txt" );
58- fileSystem = new DefaultFileSystem (new File ("src/test/resources/org/sonar/plugins/python/pylint" ));
5954
60- inputFile = new DefaultInputFile ("" , "src/prod.py" ).setLanguage (Python .KEY );
55+ fileSystem = new DefaultFileSystem (baseDir );
56+
57+ File file = new File (baseDir , "src/file1.py" );
58+ inputFile = new DefaultInputFile ("" , "src/file1.py" )
59+ .setLanguage (Python .KEY )
60+ .initMetadata (new FileMetadata ().readMetadata (file , StandardCharsets .UTF_8 ));
6161 fileSystem .add (inputFile );
6262 activeRules = (new ActiveRulesBuilder ())
6363 .create (RuleKey .of (PylintRuleRepository .REPOSITORY_KEY , "C0103" ))
@@ -67,50 +67,48 @@ public void init() {
6767 .setName ("Missing docstring" )
6868 .activate ()
6969 .build ();
70- context = mock (SensorContext .class );
71- }
72-
73- @ Test
74- public void shouldNotThrowWhenInstantiating () {
75- new PylintImportSensor (settings , activeRules , fileSystem , mock (ResourcePerspectives .class ));
7670 }
7771
7872 @ Test
7973 public void shouldExecuteOnlyWhenNecessary () {
80- DefaultFileSystem fileSystemForeign = new DefaultFileSystem (Paths .get ("" ));
81-
82- Project project = mock (Project .class );
83-
8474 ActiveRules emptyProfile = mock (ActiveRules .class );
75+ Settings settingsWithoutProperty = new MapSettings ();
8576
86- checkNecessityOfExecution ( project , activeRules , fileSystem , true );
87- checkNecessityOfExecution ( project , emptyProfile , fileSystem , false );
77+ assertThat ( shouldExecute ( activeRules , settings )). isTrue ( );
78+ assertThat ( shouldExecute ( emptyProfile , settings )). isFalse ( );
8879
89- checkNecessityOfExecution ( project , activeRules , fileSystemForeign , false );
90- checkNecessityOfExecution ( project , emptyProfile , fileSystemForeign , false );
80+ assertThat ( shouldExecute ( activeRules , settingsWithoutProperty )). isFalse ( );
81+ assertThat ( shouldExecute ( emptyProfile , settingsWithoutProperty )). isFalse ( );
9182 }
9283
93- @ Test
94- public void parse_report () {
95- ResourcePerspectives perspectives = mock (ResourcePerspectives .class );
96- Issuable issuable = mock (Issuable .class );
97- when (perspectives .as (Issuable .class , inputFile )).thenReturn (issuable );
98- Issuable .IssueBuilder issueBuilder = mock (Issuable .IssueBuilder .class );
99- when (issuable .newIssueBuilder ()).thenReturn (issueBuilder );
100- when (issueBuilder .ruleKey (Mockito .any (RuleKey .class ))).thenReturn (issueBuilder );
101- when (issueBuilder .line (Mockito .any (Integer .class ))).thenReturn (issueBuilder );
102- when (issueBuilder .message (Mockito .any (String .class ))).thenReturn (issueBuilder );
103-
104- PylintImportSensor sensor = new PylintImportSensor (settings , activeRules , fileSystem , perspectives );
105- sensor .analyse (mock (Project .class ), context );
106-
107- verify (issuable , times (3 )).addIssue (any (org .sonar .api .issue .Issue .class ));
108-
84+ private boolean shouldExecute (ActiveRules activeRules , Settings settings ) {
85+ SensorContextTester ctx = SensorContextTester .create (baseDir );
86+ ctx .setActiveRules (activeRules );
87+ ctx .setSettings (settings );
88+ ctx .setFileSystem (fileSystem );
89+ AtomicBoolean executed = new AtomicBoolean (false );
90+ PylintImportSensor sensor = new PylintImportSensor (settings ) {
91+ @ Override
92+ protected void processReports (org .sonar .api .batch .sensor .SensorContext context , List <File > reports ) {
93+ super .processReports (context , reports );
94+ executed .set (true );
95+ }
96+ };
97+ sensor .execute (ctx );
98+ return executed .get ();
10999 }
110100
111- private void checkNecessityOfExecution (Project project , ActiveRules currentActiveRules , DefaultFileSystem fileSystem , boolean shouldExecute ) {
112- PylintImportSensor sensor = new PylintImportSensor (settings , currentActiveRules , fileSystem , mock (ResourcePerspectives .class ));
113- assertThat (sensor .shouldExecuteOnProject (project )).isEqualTo (shouldExecute );
101+ @ Test
102+ public void parse_report () {
103+ SensorContextTester context = SensorContextTester .create (baseDir );
104+ context .setActiveRules (activeRules );
105+ context .setFileSystem (fileSystem );
106+
107+ PylintImportSensor sensor = new PylintImportSensor (settings );
108+ sensor .execute (context );
109+ assertThat (context .allIssues ()).hasSize (3 );
110+ assertThat (context .allIssues ()).extracting (issue -> issue .primaryLocation ().inputComponent ().key ())
111+ .containsOnly (inputFile .key ());
114112 }
115113
116114}
0 commit comments