Пример #1
0
        public async Task GetSavedQueriesAsync_returns_saved_queries()
        {
            // Arrange
            var db = Guid.NewGuid().ToString();

            InitializeDatabse(db);
            var settingsMoq = new Mock <ISejilSettings>();

            settingsMoq.SetupGet(p => p.SqliteDbPath).Returns(db);
            var repository = new SejilRepository(new SejilSqlProvider(settingsMoq.Object), settingsMoq.Object);
            await repository.SaveQueryAsync(new LogQuery { Name = "Test1", Query = "q1" });

            await repository.SaveQueryAsync(new LogQuery { Name = "Test2", Query = "q2" });

            // Act
            var queries = await repository.GetSavedQueriesAsync();

            // Assert
            Assert.Equal(2, queries.Count());
            Assert.Equal(1, queries.First().Id);
            Assert.Equal("Test1", queries.First().Name);
            Assert.Equal("q1", queries.First().Query);
            Assert.Equal(2, queries.Skip(1).First().Id);
            Assert.Equal("Test2", queries.Skip(1).First().Name);
            Assert.Equal("q2", queries.Skip(1).First().Query);
        }
Пример #2
0
        public async Task SaveQueryAsync_saves_query()
        {
            // Arrange
            var db = Guid.NewGuid().ToString();

            InitializeDatabse(db);
            var settingsMoq = new Mock <ISejilSettings>();

            settingsMoq.SetupGet(p => p.SqliteDbPath).Returns(db);
            var repository = new SejilRepository(new SejilSqlProvider(settingsMoq.Object), settingsMoq.Object);

            var logQuery = new LogQuery
            {
                Id    = 1,
                Name  = "Test",
                Query = "q"
            };

            // Act
            var result = await repository.SaveQueryAsync(logQuery);

            // Assert
            Assert.True(result);
            var savedQueries = await repository.GetSavedQueriesAsync();

            Assert.Single(savedQueries);
            Assert.Equal(1, savedQueries.First().Id);
            Assert.Equal("Test", savedQueries.First().Name);
            Assert.Equal("q", savedQueries.First().Query);
        }
Пример #3
0
        public async Task GetEventsPageAsync_no_props_returns_events_page()
        {
            // Arrange
            var db          = Guid.NewGuid().ToString();
            var settingsMoq = new Mock <ISejilSettings>();

            settingsMoq.SetupGet(p => p.SqliteDbPath).Returns(db);
            settingsMoq.SetupGet(p => p.PageSize).Returns(3);
            InitializeDatabse(db);
            var repository = new SejilRepository(new SejilSqlProvider(settingsMoq.Object), settingsMoq.Object);

            using (var conn = new SqliteConnection($"DataSource={db}"))
            {
                conn.Open();
                for (var i = 0; i < 10; i++)
                {
                    using var cmd   = conn.CreateCommand();
                    cmd.CommandText = $@"INSERT INTO log (id, message, messageTemplate, level, timestamp) 
                        VALUES ('{Guid.NewGuid().ToString()}', '{i}', '{i}', 'info', datetime(CURRENT_TIMESTAMP,'+{i} Hour'))";
                    cmd.ExecuteNonQuery();
                }
            }

            // Act
            var logs = await repository.GetEventsPageAsync(2, null, null);

            // Assert
            Assert.Equal(3, logs.Count());
            Assert.Equal("6", logs.ElementAt(0).Message);
            Assert.Empty(logs.ElementAt(0).Properties);
            Assert.Equal("5", logs.ElementAt(1).Message);
            Assert.Empty(logs.ElementAt(1).Properties);
            Assert.Equal("4", logs.ElementAt(2).Message);
            Assert.Empty(logs.ElementAt(2).Properties);
        }
Пример #4
0
        public async Task EmitBatchAsync_throws_when_null_events()
        {
            // Arrange
            var db          = Guid.NewGuid().ToString();
            var settingsMoq = new Mock <ISejilSettings>();

            settingsMoq.SetupGet(p => p.SqliteDbPath).Returns(db);
            settingsMoq.SetupGet(p => p.PageSize).Returns(100);
            settingsMoq.SetupGet(p => p.Url).Returns("/sejil");
            var repository = new SejilRepository(new SejilSqlProvider(settingsMoq.Object), settingsMoq.Object);
            var sink       = new SejilSinkMock(settingsMoq.Object);

            // Act & assert
            var ex = await Assert.ThrowsAsync <ArgumentNullException>(async() => await sink.CallEmitBatchAsync(null));

            Assert.Equal("events", ex.ParamName);
        }
Пример #5
0
        public async Task GetEventsPageAsync_returns_events_page()
        {
            // Arrange
            var db          = Guid.NewGuid().ToString();
            var settingsMoq = new Mock <ISejilSettings>();

            settingsMoq.SetupGet(p => p.SqliteDbPath).Returns(db);
            settingsMoq.SetupGet(p => p.PageSize).Returns(3);
            InitializeDatabse(db);
            var repository = new SejilRepository(new SejilSqlProvider(settingsMoq.Object), settingsMoq.Object);

            using (var conn = new SqliteConnection($"DataSource={db}"))
            {
                conn.Open();
                for (var i = 0; i < 10; i++)
                {
                    var id  = Guid.NewGuid().ToString();
                    var cmd = new SqliteCommand($@"INSERT INTO log (id, message, messageTemplate, level, timestamp) 
                        VALUES ('{id}', '{i}', '{i}', 'info', datetime(CURRENT_TIMESTAMP,'+{i} Hour'))", conn);
                    cmd.ExecuteNonQuery();

                    for (var j = 0; j < 2; j++)
                    {
                        cmd.CommandText = $@"INSERT INTO log_property (logId, name, value) VALUES 
                            ('{id}', 'n', '{i}_{j}')";
                        cmd.ExecuteNonQuery();
                    }
                }
            }

            // Act
            var logs = await repository.GetEventsPageAsync(4, null, null);

            // Assert
            Assert.Single(logs);
            Assert.Equal("0", logs.ElementAt(0).Message);
            Assert.NotNull(logs.ElementAt(0).Properties);
            Assert.Equal(2, logs.ElementAt(0).Properties.Count);
            Assert.Equal("0_0", logs.ElementAt(0).Properties.ElementAt(0).Value);
            Assert.Equal("0_1", logs.ElementAt(0).Properties.ElementAt(1).Value);
        }
Пример #6
0
        public async Task DeleteQueryAsync_deletes_specified_query()
        {
            // Arrange
            var db = Guid.NewGuid().ToString();

            InitializeDatabse(db);
            var settingsMoq = new Mock <ISejilSettings>();

            settingsMoq.SetupGet(p => p.SqliteDbPath).Returns(db);
            var repository = new SejilRepository(new SejilSqlProvider(settingsMoq.Object), settingsMoq.Object);
            await repository.SaveQueryAsync(new LogQuery { Name = "Test1", Query = "q1" });

            // Act
            var result = await repository.DeleteQueryAsync("Test1");

            // Assert
            Assert.True(result);
            var queries = await repository.GetSavedQueriesAsync();

            Assert.Empty(queries);
        }
Пример #7
0
        public async Task DeleteQueryAsync_returns_false_when_specified_query_does_not_exist()
        {
            // Arrange
            var db = Guid.NewGuid().ToString();

            InitializeDatabse(db);
            var settingsMoq = new Mock <ISejilSettings>();

            settingsMoq.SetupGet(p => p.ConnectionString).Returns(db);
            var repository = new SejilRepository(new SejilSqlProvider(settingsMoq.Object), settingsMoq.Object);
            await repository.SaveQueryAsync(new LogQuery { Name = "Test1", Query = "q1" });

            // Act
            var result = await repository.DeleteQueryAsync("Test2");

            // Assert
            Assert.False(result);
            var queries = await repository.GetSavedQueriesAsync();

            Assert.Single(queries);
        }
Пример #8
0
        public async Task EmitBatchAsync_ignores_events_with_sejil_url_in_RequestPath_or_Path_properties(string propertyName)
        {
            // Arrange
            var db          = Guid.NewGuid().ToString();
            var settingsMoq = new Mock <ISejilSettings>();

            settingsMoq.SetupGet(p => p.SqliteDbPath).Returns(db);
            settingsMoq.SetupGet(p => p.PageSize).Returns(100);
            settingsMoq.SetupGet(p => p.Url).Returns("/sejil");
            var repository = new SejilRepository(new SejilSqlProvider(settingsMoq.Object), settingsMoq.Object);
            var sink       = new SejilSinkMock(settingsMoq.Object);

            var tokens = new List <MessageTemplateToken>
            {
                new PropertyToken(propertyName, "{" + propertyName + "}"),
            };

            var properties = new List <LogEventProperty>
            {
                new LogEventProperty(propertyName, new ScalarValue("/sejil/events")),
            };

            var messageTemplate = new MessageTemplate(tokens);

            var events = new List <LogEvent>
            {
                new LogEvent(DateTime.Now, LogEventLevel.Information, null, messageTemplate, properties),
            };

            // Act
            await sink.CallEmitBatchAsync(events);

            // Assert
            var logEvents = await repository.GetEventsPageAsync(1, null, null);

            Assert.Equal(0, logEvents.Count());
        }
Пример #9
0
        public async Task EmitBatchAsync_inserts_events_to_database()
        {
            // Arrange
            var db          = Guid.NewGuid().ToString();
            var settingsMoq = new Mock <ISejilSettings>();

            settingsMoq.SetupGet(p => p.SqliteDbPath).Returns(db);
            settingsMoq.SetupGet(p => p.PageSize).Returns(100);
            var repository = new SejilRepository(new SejilSqlProvider(settingsMoq.Object), settingsMoq.Object);
            var sink       = new SejilSinkMock(settingsMoq.Object);

            // Hello, {name}. Your # is {number}
            var tokens = new List <MessageTemplateToken>
            {
                new TextToken("Hello, ", 0),
                new PropertyToken("name", "{name}"),
                new TextToken(". Your # is ", 13),
                new PropertyToken("number", "{number}"),
            };

            var properties = new List <LogEventProperty>
            {
                new LogEventProperty("name", new ScalarValue("world")),
                new LogEventProperty("number", new ScalarValue(null))
            };

            var messageTemplate = new MessageTemplate(tokens);

            var timestamp1 = new DateTime(2017, 8, 3, 11, 44, 15, 542, DateTimeKind.Local);
            var timestamp2 = new DateTime(2017, 9, 3, 11, 44, 15, 542, DateTimeKind.Local);

            var events = new List <LogEvent>
            {
                new LogEvent(timestamp1, LogEventLevel.Information, null, messageTemplate, properties),
                new LogEvent(timestamp2, LogEventLevel.Debug, new Exception("error"), messageTemplate, properties),
            };

            // Act
            await sink.CallEmitBatchAsync(events);

            // Assert
            var logEvents = await repository.GetEventsPageAsync(1, null, null);

            Assert.Equal(2, logEvents.Count());

            var logEvent1 = logEvents.FirstOrDefault(p => p.Level == "Information");

            Assert.Equal("Hello, \"world\". Your # is null", logEvent1.Message);
            Assert.Equal("Hello, {name}. Your # is {number}", logEvent1.MessageTemplate);
            Assert.Equal("Information", logEvent1.Level);
            Assert.Equal(timestamp1, logEvent1.Timestamp);
            Assert.Null(logEvent1.Exception);
            Assert.Equal(2, logEvent1.Properties.Count());
            Assert.Equal(logEvent1.Id, logEvent1.Properties.ElementAt(0).LogId);
            Assert.Equal("name", logEvent1.Properties.ElementAt(0).Name);
            Assert.Equal("world", logEvent1.Properties.ElementAt(0).Value);
            Assert.Equal(logEvent1.Id, logEvent1.Properties.ElementAt(1).LogId);
            Assert.Equal("number", logEvent1.Properties.ElementAt(1).Name);
            Assert.Equal("null", logEvent1.Properties.ElementAt(1).Value);

            var logEvent2 = logEvents.FirstOrDefault(p => p.Level == "Debug");

            Assert.Equal("Hello, \"world\". Your # is null", logEvent2.Message);
            Assert.Equal("Hello, {name}. Your # is {number}", logEvent2.MessageTemplate);
            Assert.Equal("Debug", logEvent2.Level);
            Assert.Equal(timestamp2, logEvent2.Timestamp);
            Assert.Equal("System.Exception: error", logEvent2.Exception);
            Assert.Equal(2, logEvent2.Properties.Count());
            Assert.Equal(logEvent2.Id, logEvent2.Properties.ElementAt(0).LogId);
            Assert.Equal("name", logEvent2.Properties.ElementAt(0).Name);
            Assert.Equal("world", logEvent2.Properties.ElementAt(0).Value);
            Assert.Equal(logEvent2.Id, logEvent2.Properties.ElementAt(1).LogId);
            Assert.Equal("number", logEvent2.Properties.ElementAt(1).Name);
            Assert.Equal("null", logEvent2.Properties.ElementAt(1).Value);
        }