예제 #1
0
        public void DisableRule(string ruleId)
        {
            Debug.Assert(!string.IsNullOrEmpty(ruleId), "DisableRule: ruleId should not be null/empty");

            if (UserSettings.RulesSettings.Rules.TryGetValue(ruleId, out var ruleConfig))
            {
                ruleConfig.Level = RuleLevel.Off;
            }
            else
            {
                UserSettings.RulesSettings.Rules[ruleId] = new RuleConfig {
                    Level = RuleLevel.Off
                };
            }

            serializer.SafeSave(SettingsFilePath, UserSettings.RulesSettings);
        }
예제 #2
0
        public void Save_NonCriticalError_IsSquashed()
        {
            // Arrange
            var fileSystemMock = new Mock <IFileSystem>();

            fileSystemMock.Setup(x => x.File.WriteAllText("settings.file", It.IsAny <string>())).Throws(new System.InvalidOperationException("custom error message"));

            var logger      = new TestLogger(logToConsole: true);
            var testSubject = new RulesSettingsSerializer(fileSystemMock.Object, logger);

            // Act - should not throw
            testSubject.SafeSave("settings.file", new RulesSettings());

            // Assert
            logger.AssertPartialOutputStringExists("settings.file", "custom error message");
        }
예제 #3
0
        public void Save_CriticalError_IsNotSquashed()
        {
            // Arrange
            var fileSystemMock = new Mock <IFileSystem>();

            fileSystemMock.Setup(x => x.File.WriteAllText("settings.file", It.IsAny <string>())).Throws(new System.StackOverflowException("critical custom error message"));

            var logger      = new TestLogger(logToConsole: true);
            var testSubject = new RulesSettingsSerializer(fileSystemMock.Object, logger);

            // Act
            Action act = () => testSubject.SafeSave("settings.file", new RulesSettings());

            // Assert
            act.Should().ThrowExactly <StackOverflowException>().And.Message.Should().Be("critical custom error message");
            logger.AssertPartialOutputStringDoesNotExist("critical custom error message");
        }
        private static void SaveSettings(string filePath, RulesSettings userSettings)
        {
            var serializer = new RulesSettingsSerializer(new FileSystem(), new TestLogger());

            serializer.SafeSave(filePath, userSettings);
        }
예제 #5
0
        public void RealFile_RoundTripLoadAndSave_WithFirstCapsPropertyNames()
        {
            // Note: the JSON serializer is configured to save property names
            // to lower-case by default i.e. "level", "severity" etc.
            // However, it should tolerate loading files with first-caps names
            // e.g. "Level", "Parameters" etc.
            // This snippet uses upper-case "Level", "Severity" and "Parameters"
            // to check they are processed correctly.

            // Arrange
            var testLogger = new TestLogger(logToConsole: true);

            var dir = CreateTestSpecificDirectory();

            var filePath1 = Path.Combine(dir, "settings.json");
            var filePath2 = Path.Combine(dir, "settings.json.txt");

            const string validSettingsData = @"{
    'UnknownData' : 'will be dropped on save',

    'sonarlint.rules': {
        'typescript:S2685': {
            'Level': 'On',
            'Parameters': {
              'key1': 'value1'
            },
            'Severity': 'Critical' 
        },
        'xxx:yyy': {
            'level': 'off',
            'parameters': {
              'key2': 'value2',
              'key3': 'value3'
            },
            'severity': 'Blocker'
        }
    },

    'More UnknownData' : 'will also be dropped on save',
}";

            File.WriteAllText(filePath1, validSettingsData);

            var testSubject = new RulesSettingsSerializer(new FileSystem(), testLogger);

            // 1. Load from disc
            var loadedSettings = testSubject.SafeLoad(filePath1);

            loadedSettings.Should().NotBeNull();
            loadedSettings.Rules.Should().NotBeNull();
            loadedSettings.Rules.Count.Should().Be(2);

            // Check loaded data
            loadedSettings.Rules["typescript:S2685"].Level.Should().Be(RuleLevel.On);
            loadedSettings.Rules["xxx:yyy"].Level.Should().Be(RuleLevel.Off);

            loadedSettings.Rules["typescript:S2685"].Parameters.Should().NotBeNull();
            loadedSettings.Rules["typescript:S2685"].Parameters["key1"].Should().Be("value1");

            loadedSettings.Rules["xxx:yyy"].Parameters.Should().NotBeNull();
            loadedSettings.Rules["xxx:yyy"].Parameters["key2"].Should().Be("value2");
            loadedSettings.Rules["xxx:yyy"].Parameters["key3"].Should().Be("value3");

            loadedSettings.Rules["typescript:S2685"].Severity.Should().Be(IssueSeverity.Critical);
            loadedSettings.Rules["xxx:yyy"].Severity.Should().Be(IssueSeverity.Blocker);

            // 2. Save and reload
            testSubject.SafeSave(filePath2, loadedSettings);
            File.Exists(filePath2).Should().BeTrue();
            var reloadedSettings = testSubject.SafeLoad(filePath2);

            TestContext.AddResultFile(filePath2);

            reloadedSettings.Should().NotBeNull();
            reloadedSettings.Rules.Should().NotBeNull();
            reloadedSettings.Rules.Count.Should().Be(2);

            // Check loaded data
            reloadedSettings.Rules["typescript:S2685"].Level.Should().Be(RuleLevel.On);
            reloadedSettings.Rules["xxx:yyy"].Level.Should().Be(RuleLevel.Off);

            loadedSettings.Rules["typescript:S2685"].Parameters.Should().NotBeNull();
            loadedSettings.Rules["typescript:S2685"].Parameters["key1"].Should().Be("value1");

            loadedSettings.Rules["xxx:yyy"].Parameters.Should().NotBeNull();
            loadedSettings.Rules["xxx:yyy"].Parameters["key2"].Should().Be("value2");
            loadedSettings.Rules["xxx:yyy"].Parameters["key3"].Should().Be("value3");
        }
예제 #6
0
        public void RealFile_RoundTripSaveAndLoad()
        {
            // Arrange
            var testLogger = new TestLogger(logToConsole: true);

            var dir      = CreateTestSpecificDirectory();
            var filePath = Path.Combine(dir, "settings.txt");

            var settings = new RulesSettings
            {
                Rules = new Dictionary <string, RuleConfig>
                {
                    { "repo1:key1", new RuleConfig {
                          Level = RuleLevel.Off, Severity = IssueSeverity.Major
                      } },
                    { "repo1:key2", new RuleConfig {
                          Level = RuleLevel.On, Severity = IssueSeverity.Blocker
                      } },
                    { "repox:keyy",
                      new RuleConfig
                      {
                          Level      = RuleLevel.On,
                          Parameters = new Dictionary <string, string>
                          {
                              { "key1", "value1" },
                              { "key2", "value2" }
                          }
                      } }
                }
            };

            var testSubject = new RulesSettingsSerializer(new FileSystem(), testLogger);

            // Act: save and reload
            testSubject.SafeSave(filePath, settings);
            File.Exists(filePath).Should().BeTrue();

            var reloadedSettings = testSubject.SafeLoad(filePath);

            TestContext.AddResultFile(filePath);

            reloadedSettings.Should().NotBeNull();
            reloadedSettings.Rules.Should().NotBeNull();
            reloadedSettings.Rules.Count.Should().Be(3);

            // Check loaded data
            reloadedSettings.Rules["repo1:key1"].Level.Should().Be(RuleLevel.Off);
            reloadedSettings.Rules["repo1:key2"].Level.Should().Be(RuleLevel.On);
            reloadedSettings.Rules["repox:keyy"].Level.Should().Be(RuleLevel.On);

            reloadedSettings.Rules["repo1:key1"].Severity.Should().Be(IssueSeverity.Major);
            reloadedSettings.Rules["repo1:key2"].Severity.Should().Be(IssueSeverity.Blocker);
            reloadedSettings.Rules["repox:keyy"].Severity.Should().BeNull();

            reloadedSettings.Rules["repo1:key1"].Parameters.Should().BeNull();
            reloadedSettings.Rules["repo1:key2"].Parameters.Should().BeNull();

            var rulexParams = reloadedSettings.Rules["repox:keyy"].Parameters;

            rulexParams.Should().NotBeNull();

            rulexParams.Keys.Should().BeEquivalentTo("key1", "key2");
            rulexParams["key1"].Should().Be("value1");
            rulexParams["key2"].Should().Be("value2");
        }