public void ExtractDetails()
        {
            var startEvent1 = GetStartEvent(1, "refresh_extracts"); // Extract refresh with details

            startEvent1.Args = "[TestyTest, blah, Datasource]";
            var startEvent2 = GetStartEvent(2, "refresh_extracts");   // Extract refresh without details
            var startEvent3 = GetStartEvent(3, "increment_extracts"); // Incremental refresh
            var startEvent4 = GetStartEvent(4, "some_other_job");     // Some other job type

            var endEvent1 = GetEndEvent(1);
            var endEvent2 = GetEndEvent(2);
            var endEvent3 = GetEndEvent(3);
            var endEvent4 = GetEndEvent(4);

            var detail1 = GetExtractJobDetail(1);
            var detail2 = new BackgrounderExtractJobDetail()
            {
                BackgrounderJobId = 2,
                ResourceType      = "testArgument"
            };
            var detail3 = GetExtractJobDetail(3);
            var detail4 = GetExtractJobDetail(4);

            _persister.AddStartEvent(startEvent1);
            _persister.AddStartEvent(startEvent2);
            _persister.AddStartEvent(startEvent3);
            _persister.AddStartEvent(startEvent4);
            _persister.AddExtractJobDetails(detail1);
            _persister.AddExtractJobDetails(detail3);
            _persister.AddExtractJobDetails(detail4);
            _persister.AddEndEvent(endEvent1);
            _persister.AddEndEvent(endEvent2);
            _persister.AddEndEvent(endEvent3);
            _persister.AddEndEvent(endEvent4);

            var jobWriter = _writerFactory.GetWriterByName <BackgrounderJob>("BackgrounderJobs");

            jobWriter.ReceivedObjects.Count.Should().Be(4);

            var extractJobDetailWriter = _writerFactory.GetWriterByName <BackgrounderExtractJobDetail>("BackgrounderExtractJobDetails");

            extractJobDetailWriter.ReceivedObjects.Count.Should().Be(3);
            var actualDetail1 = extractJobDetailWriter.ReceivedObjects[0] as BackgrounderExtractJobDetail;
            var actualDetail2 = extractJobDetailWriter.ReceivedObjects[1] as BackgrounderExtractJobDetail;
            var actualDetail3 = extractJobDetailWriter.ReceivedObjects[2] as BackgrounderExtractJobDetail;

            detail1.ResourceName = "TestyTest";
            detail1.ResourceType = "Datasource";
            actualDetail1.Should().BeEquivalentTo(detail1);
            actualDetail2.Should().BeEquivalentTo(detail2);
            actualDetail3.Should().BeEquivalentTo(detail3);
        }
        public void TestWithDifferentMaxLimitConfigured(bool useConfig, int?maxLength)
        {
            var config = useConfig
                ? CreateConfig(maxLength)
                : null;
            var testWriterFactory = new TestWriterFactory();

            using (var plugin = new VizqlDesktopPlugin())
            {
                plugin.Configure(testWriterFactory, config, null, new NullLoggerFactory());

                foreach (var testCase in _testCases)
                {
                    var logLine = testCase.GetLogLine();
                    plugin.ProcessLogLine(logLine, LogType.VizqlDesktop);
                }

                plugin.CompleteProcessing();
            }

            testWriterFactory.AssertAllWritersDisposedState(true);

            var expectedSessions = GetExpectedOutputForName("session");
            var sessionsWriter   = testWriterFactory.GetWriterByName <VizqlDesktopSession>("VizqlDesktopSessions");

            sessionsWriter.ReceivedObjects.Should().BeEquivalentTo(expectedSessions);

            var expectedErrors = GetExpectedOutputForName("error");
            var errorsWriter   = testWriterFactory.GetWriterByName <VizqlDesktopErrorEvent>("VizqlDesktopErrorEvents");

            errorsWriter.ReceivedObjects.Should().BeEquivalentTo(expectedErrors);

            var expectedEndQueryEvents = GetExpectedOutputForName("endQuery");

            if (useConfig && maxLength != null)
            {
                expectedEndQueryEvents = TruncateQueryText(expectedEndQueryEvents, maxLength.Value);
            }
            var endQueryEventsWriter = testWriterFactory.GetWriterByName <VizqlEndQueryEvent>("VizqlDesktopEndQueryEvents");

            endQueryEventsWriter.ReceivedObjects.Should().BeEquivalentTo(expectedEndQueryEvents);

            var expectedPerformanceEvents = GetExpectedOutputForName("performance");
            var extraEvent = GetPerformanceEvent(8.985, "end-query", 126, @"{""cols"":1,""elapsed"":8.985,""is-command"":false,""protocol-class"":""postgres"",""protocol-id"":44,""query-category"":""Data"",""query-hash"":3535682211,""query-trunc"":""SELECT * FROM very_long_table_name_so_we_have_something_to_truncate;"",""rows"":3}");

            expectedPerformanceEvents.Insert(0, extraEvent);
            var performanceEventsWriter = testWriterFactory.GetWriterByName <VizqlPerformanceEvent>("VizqlDesktopPerformanceEvents");

            performanceEventsWriter.ReceivedObjects.Should().BeEquivalentTo(expectedPerformanceEvents);
        }