public Task Fail_WhenNotConfirmed() { #region Arrange const int taskId = 3; var modelMock = new Mock <IModel>(); modelMock.Setup(m => m.NextPublishSeqNo) .Returns(taskId); var propertiesMock = new FakeOptions { Headers = new Dictionary <string, object>() }; var confirmableChannel = new PublishConfirmableChannel(modelMock.Object); #endregion Arrange #region Act var publishTask = confirmableChannel.BasicPublishAsync( string.Empty, string.Empty, true, propertiesMock, ReadOnlyMemory <byte> .Empty ); Assert.IsTrue(confirmableChannel.HasTaskWith(taskId), "PublishTaskInfo not added!"); modelMock.Raise(m => m.ModelShutdown += null, new ShutdownEventArgs( ShutdownInitiator.Application, 500, "REASON_FROM_RABBIT" ) ); #endregion Act #region Assert return(publishTask.ContinueWith(t => { Assert.IsTrue(t.IsFaulted, "Task should be faulted."); Assert.AreEqual( "The message was not confirmed by RabbitMQ within the specified period. REASON_FROM_RABBIT", t.Exception?.InnerException?.Message ); Assert.IsFalse(confirmableChannel.HasTaskWith(taskId)); })); #endregion Assert }
public async Task Returns_failure_for_unauthorized_token(string exceptionTypeToThrow) { const string AudienceForTest = "AudienceForTest"; const string IssuerUrlForTest = "https://issuerUrl.for.test/"; const string ExtractedTokenForTest = "ExtractedTokenForTest"; Exception exceptionToThrow = exceptionTypeToThrow == "SecurityTokenException" ? new SecurityTokenException() : new Exception(); var fakeApiAuthorizationSettingsOptions = new FakeOptions <OidcApiAuthorizationSettings>() { Value = new OidcApiAuthorizationSettings() { Audience = AudienceForTest, IssuerUrl = IssuerUrlForTest } }; var fakeAuthorizationHeaderBearerTokenExractor = new FakeAuthorizationHeaderBearerTokenExractor() { TokenToReturn = ExtractedTokenForTest }; var fakeJwtSecurityTokenHandlerWrapper = new FakeJwtSecurityTokenHandlerWrapper() { // Throw for unauthrorized token. ExceptionToThrow = exceptionToThrow }; var fakeOidcConfigurationManager = new FakeOidcConfigurationManager() { SecurityKeysForTest = new List <SecurityKey>() }; IHeaderDictionary httpRequestHeaders = null; var service = new OidcApiAuthorizationService( fakeApiAuthorizationSettingsOptions, fakeAuthorizationHeaderBearerTokenExractor, fakeJwtSecurityTokenHandlerWrapper, fakeOidcConfigurationManager); ApiAuthorizationResult result = await service.AuthorizeAsync( httpRequestHeaders); Assert.True(result.Failed); Assert.Equal(1, fakeJwtSecurityTokenHandlerWrapper.ValidateTokenCalledCount); Assert.Equal(0, fakeOidcConfigurationManager.RequestRefreshCalledCount); }
public Task Fail_WhenNack() { #region Arrange const int taskId = 2; var modelMock = new Mock <IModel>(); modelMock.Setup(m => m.NextPublishSeqNo) .Returns(taskId); var propertiesMock = new FakeOptions { Headers = new Dictionary <string, object>() }; var confirmableChannel = new PublishConfirmableChannel(modelMock.Object); #endregion Arrange #region Act var publishTask = confirmableChannel.BasicPublishAsync( string.Empty, string.Empty, true, propertiesMock, ReadOnlyMemory <byte> .Empty ); Assert.IsTrue(confirmableChannel.HasTaskWith(taskId), "PublishTaskInfo not added!"); modelMock.Raise(m => m.BasicNacks += null, new BasicNackEventArgs { DeliveryTag = taskId, Multiple = false }); #endregion Act #region Assert return(publishTask.ContinueWith(t => { Assert.IsTrue(t.IsFaulted); Assert.AreEqual("The message was not acknowledged by RabbitMQ", t.Exception?.InnerException?.Message); Assert.IsFalse(confirmableChannel.HasTaskWith(taskId)); })); #endregion Assert }
public Task Success_WhenAck() { #region Arrange const int taskId = 1; var modelMock = new Mock <IModel>(); modelMock.Setup(m => m.NextPublishSeqNo) .Returns(taskId); var propertiesMock = new FakeOptions { Headers = new Dictionary <string, object>() }; var confirmableChannel = new PublishConfirmableChannel(modelMock.Object); #endregion Arrange #region Act var publishTask = confirmableChannel.BasicPublishAsync( string.Empty, string.Empty, true, propertiesMock, ReadOnlyMemory <byte> .Empty ); Assert.IsTrue(confirmableChannel.HasTaskWith(taskId), "PublishTaskInfo not added!"); modelMock.Raise(m => m.BasicAcks += null, new BasicAckEventArgs { DeliveryTag = taskId, Multiple = false }); #endregion Act #region Assert return(publishTask.ContinueWith(t => { Assert.IsTrue(t.IsCompletedSuccessfully, "Task should complete successful"); Assert.IsFalse(confirmableChannel.HasTaskWith(taskId), "PublishTaskInfo not removed!"); })); #endregion Assert }
public Task Fail_WhenTimedOut() { #region Arrange const int taskId = 5; var modelMock = new Mock <IModel>(); modelMock.Setup(m => m.NextPublishSeqNo) .Returns(taskId); var propertiesMock = new FakeOptions { Headers = new Dictionary <string, object>() }; // timeout confirm immediatelly - we can add task to tracker, but timeout cancel it fast var confirmTimeout = TimeSpan.FromMilliseconds(10); var confirmableChannel = new PublishConfirmableChannel(modelMock.Object, confirmTimeout); #endregion Arrange #region Act var publishTask = confirmableChannel.BasicPublishAsync( string.Empty, string.Empty, true, propertiesMock, ReadOnlyMemory <byte> .Empty, 0 ); Assert.IsTrue(confirmableChannel.HasTaskWith(taskId), "PublishTaskInfo not added!"); #endregion Act #region Assert return(publishTask.ContinueWith(t => { Assert.IsTrue(t.IsCanceled, "Task should be cancelled."); Assert.IsNull(t.Exception); Assert.IsFalse(confirmableChannel.HasTaskWith(taskId)); })); #endregion Assert }
public async Task Retrys_once_if_SecurityTokenSignatureKeyNotFoundException() { const string AudianceForTest = "AudianceForTest"; const string IssuerUrlForTest = "https://issuerUrl.for.test/"; const string ExtractedTokenForTest = "ExtractedTokenForTest"; var fakeApiAuthorizationSettingsOptions = new FakeOptions <OidcApiAuthorizationSettings>() { Value = new OidcApiAuthorizationSettings() { Audience = AudianceForTest, IssuerUrl = IssuerUrlForTest } }; var fakeAuthorizationHeaderBearerTokenExractor = new FakeAuthorizationHeaderBearerTokenExractor() { TokenToReturn = ExtractedTokenForTest }; var fakeJwtSecurityTokenHandlerWrapper = new FakeJwtSecurityTokenHandlerWrapper() { ThrowFirstTime = true }; var fakeOidcConfigurationManager = new FakeOidcConfigurationManager() { SecurityKeysForTest = new List <SecurityKey>() }; IHeaderDictionary httpRequestHeaders = null; var service = new OidcApiAuthorizationService( fakeApiAuthorizationSettingsOptions, fakeAuthorizationHeaderBearerTokenExractor, fakeJwtSecurityTokenHandlerWrapper, fakeOidcConfigurationManager); ApiAuthorizationResult result = await service.AuthorizeAsync( httpRequestHeaders); Assert.True(result.Success); Assert.Equal(2, fakeJwtSecurityTokenHandlerWrapper.ValidateTokenCalledCount); Assert.Equal(1, fakeOidcConfigurationManager.RequestRefreshCalledCount); }
public void Parse_options() { // Fixture setup var expectedOptions = new FakeOptions { StringValue = "strvalue", IntSequence = new[] { 1, 2, 3 } }; var sut = new Parser(); // Exercize system var result = sut.ParseArguments <FakeOptions>(new[] { "--stringvalue=strvalue", "-i1", "2", "3" }); // Verify outcome ((Parsed <FakeOptions>)result).Value.ShouldBeEquivalentTo(expectedOptions); // Teardown }
public void Should_throw_when_generator_fails_and_arguments_for_constructor_are_specified() { // Arrange this.StubProxyGeneratorToFail("fail reason"); var options = new FakeOptions { ArgumentsForConstructor = new object[] { "argument for constructor " } }; // Act this.fakeObjectCreator.CreateFake(typeof(IFoo), options, A.Dummy <IDummyValueCreationSession>(), throwOnFailure: true); // Assert A.CallTo(() => this.thrower.ThrowFailedToGenerateProxyWithArgumentsForConstructor(typeof(IFoo), "fail reason")) .MustHaveHappened(); }
public void Parse_options() { // Fixture setup var expectedOptions = new FakeOptions { StringValue = "strvalue", IntSequence = new[] { 1, 2, 3 } }; var sut = new Parser(); // Exercize system var result = sut.ParseArguments <FakeOptions>(new[] { "--stringvalue=strvalue", "-i1", "2", "3" }); // Verify outcome result.Value.ShouldHave().AllProperties().EqualTo(expectedOptions); Assert.False(result.Errors.Any()); // Teardown }
public void Should_try_protected_constructors() { // Arrange var session = A.Fake <IDummyValueCreationSession>(); StubSessionWithDummyValue(session, 1); this.StubProxyGeneratorToFail(); var options = new FakeOptions(); // Act this.fakeObjectCreator.CreateFake(typeof(TypeWithProtectedConstructor), options, session, throwOnFailure: false); // Assert A.CallTo(() => this.proxyGenerator.GenerateProxy(typeof(TypeWithProtectedConstructor), options.AdditionalInterfacesToImplement, A <IEnumerable <object> > .That.IsThisSequence(1), A <IEnumerable <CustomAttributeBuilder> > ._, A <IFakeCallProcessorProvider> ._)) .MustHaveHappened(); }
public void Should_use_new_fake_call_processor_for_the_proxy_generator() { // Arrange var options = new FakeOptions(); var fakeCallProcessorProvider = A.Fake <IFakeCallProcessorProvider>(); A.CallTo(() => this.fakeCallProcessorProviderFactory(A <Type> ._, A <FakeOptions> ._)).Returns(fakeCallProcessorProvider); // Act this.fakeObjectCreator.CreateFake(typeof(IFoo), options, A.Dummy <IDummyValueCreationSession>(), throwOnFailure: false); // Assert A.CallTo(() => this.fakeCallProcessorProviderFactory(typeof(IFoo), options)).MustHaveHappened(); A.CallTo(() => this.proxyGenerator.GenerateProxy(A <Type> ._, A <IEnumerable <Type> > ._, A <IEnumerable <object> > ._, A <IEnumerable <CustomAttributeBuilder> > ._, fakeCallProcessorProvider)) .MustHaveHappened(); }
public void Short_Parameters_names_are_used() { // Fixture setup var expectedOptions = new FakeOptions { IntSequence = new[] { 1, 2, 3 }, BoolValue = true }; var sut = new Parser(); // Exercize system var result = sut.ParseArguments <FakeOptions>(new[] { "-x", "-i1", "2", "3" }); // Verify outcome result.Value.ShouldHave().AllProperties().EqualTo(expectedOptions); Assert.False(result.Errors.Any()); // Teardown }
public async Task Returns_failure_if_cant_get_signing_keys_from_issuer() { const string AudianceForTest = "AudianceForTest"; const string IssuerUrlForTest = "https://issuerUrl.for.test/"; const string ExtractedTokenForTest = "ExtractedTokenForTest"; const string ExceptionMessageForTest = "ExceptionMessageForTest"; var fakeApiAuthorizationSettingsOptions = new FakeOptions <OidcApiAuthorizationSettings>() { Value = new OidcApiAuthorizationSettings() { Audience = AudianceForTest, IssuerUrl = IssuerUrlForTest } }; var fakeAuthorizationHeaderBearerTokenExractor = new FakeAuthorizationHeaderBearerTokenExractor() { TokenToReturn = ExtractedTokenForTest }; var fakeOidcConfigurationManager = new FakeOidcConfigurationManager() { ExceptionMessageForTest = ExceptionMessageForTest, }; IHeaderDictionary httpRequestHeaders = null; var service = new OidcApiAuthorizationService( fakeApiAuthorizationSettingsOptions, fakeAuthorizationHeaderBearerTokenExractor, jwtSecurityTokenHandlerWrapper: null, // Not accessed in this test. fakeOidcConfigurationManager); ApiAuthorizationResult result = await service.AuthorizeAsync( httpRequestHeaders); Assert.True(result.Failed); Assert.StartsWith( "Problem getting signing keys from Open ID Connect provider (issuer).", result.FailureReason); }
public void Should_use_new_fake_call_processor_for_every_tried_constructor() { // Arrange var session = A.Fake <IDummyValueCreationSession>(); StubSessionWithDummyValue(session, 1); StubSessionWithDummyValue(session, "dummy"); this.StubProxyGeneratorToFail(); var options = new FakeOptions(); // Act this.fakeObjectCreator.CreateFake(typeof(TypeWithMultipleConstructors), options, session, throwOnFailure: false); // Assert A.CallTo(() => this.fakeCallProcessorProviderFactory(typeof(TypeWithMultipleConstructors), options)) .MustHaveHappened(Repeated.Exactly.Times(3)); }
public FakeManagerProvider( FakeManager.Factory fakeManagerFactory, IFakeManagerAccessor fakeManagerAccessor, IFakeObjectConfigurator fakeObjectConfigurator, Type typeOfFake, FakeOptions fakeOptions) { Guard.AgainstNull(fakeManagerFactory, "fakeManagerFactory"); Guard.AgainstNull(fakeManagerAccessor, "fakeManagerAccessor"); Guard.AgainstNull(fakeObjectConfigurator, "fakeObjectConfigurator"); Guard.AgainstNull(typeOfFake, "typeOfFake"); Guard.AgainstNull(fakeOptions, "fakeOptions"); this.fakeManagerFactory = fakeManagerFactory; this.fakeManagerAccessor = fakeManagerAccessor; this.fakeObjectConfigurator = fakeObjectConfigurator; this.typeOfFake = typeOfFake; this.fakeOptions = fakeOptions; }
public async void Returns_error_if_missing_all_settings() { var fakeApiAuthorizationSettingsOptions = new FakeOptions <OidcApiAuthorizationSettings>() { Value = null // No settings. }; var service = new OidcApiAuthorizationService( fakeApiAuthorizationSettingsOptions, authorizationHeaderBearerTokenExractor: null, // Not accessed in this test. jwtSecurityTokenHandlerWrapper: null, // Not accessed in this test. oidcConfigurationManager: null);; // Not accessed in this test. HealthCheckResult result = await service.HealthCheckAsync(); Assert.False(result.IsHealthy); Assert.Equal(_expectedMissingSettingsMessage, result.BadHealthMessage); }
public void Should_not_perform_actions_froM_options_when_trying_to_create_fake_but_fails() { // Arrange var wasInvoked = false; var options = new FakeOptions(); options.OnFakeCreatedActions.Add(x => wasInvoked = true); A.CallTo(() => this.fakeCreator.CreateFake(A <Type> ._, A <FakeOptions> ._, A <IDummyValueCreationSession> ._, A <bool> ._)) .Returns(null); // Act this.manager.TryCreateFake(typeof(IFoo), options, out Ignore.This <object>().Value); // Assert Assert.That(wasInvoked, Is.False); }
public void Explicit_help_request_generates_help_requested_error() { // Fixture setup var fakeOptions = new FakeOptions(); var expectedResult = new NotParsed <FakeOptions>( TypeInfo.Create(typeof(FakeOptions)), new Error[] { new HelpRequestedError() }); // Exercize system var result = InstanceBuilder.Build( Maybe.Just <Func <FakeOptions> >(() => fakeOptions), new[] { "--help" }, StringComparer.Ordinal, CultureInfo.InvariantCulture); // Verify outcome Assert.True(expectedResult.Equals(result)); // Teardown }
public void Parse_to_mutable() { // Fixture setup var expectedResult = new FakeOptions { StringValue = "strval0", IntSequence = new[] { 9, 7, 8 }, BoolValue = true, LongValue = 9876543210L }; // Exercize system var result = InstanceBuilder.Build( Maybe.Just <Func <FakeOptions> >(() => new FakeOptions()), new[] { "--stringvalue=strval0", "-i", "9", "7", "8", "-x", "9876543210" }, StringComparer.Ordinal, CultureInfo.InvariantCulture); // Verify outcome expectedResult.ShouldBeEquivalentTo(((Parsed <FakeOptions>)result).Value); // Teardown }
public async Task Returns_success_for_happy_path() { const string AudianceForTest = "AudianceForTest"; const string IssuerUrlForTest = "https://issuerUrl.for.test/"; const string ExtractedTokenForTest = "ExtractedTokenForTest"; var fakeApiAuthorizationSettingsOptions = new FakeOptions <OidcApiAuthorizationSettings>() { Value = new OidcApiAuthorizationSettings() { Audience = AudianceForTest, IssuerUrl = IssuerUrlForTest } }; var fakeAuthorizationHeaderBearerTokenExractor = new FakeAuthorizationHeaderBearerTokenExractor() { TokenToReturn = ExtractedTokenForTest }; var fakeJwtSecurityTokenHandlerWrapper = new FakeJwtSecurityTokenHandlerWrapper(); var fakeOidcConfigurationManager = new FakeOidcConfigurationManager() { SecurityKeysForTest = new List <SecurityKey>() }; IHeaderDictionary httpRequestHeaders = null; var service = new OidcApiAuthorizationService( fakeApiAuthorizationSettingsOptions, fakeAuthorizationHeaderBearerTokenExractor, fakeJwtSecurityTokenHandlerWrapper, fakeOidcConfigurationManager); ApiAuthorizationResult result = await service.AuthorizeAsync( httpRequestHeaders); Assert.True(result.Success); }
public void Should_not_try_to_resolve_constructors_when_arguments_for_constructor_are_specified() { // Arrange var session = A.Fake <IDummyValueCreationSession>(); StubSessionWithDummyValue(session, 1); this.StubProxyGeneratorToFail(); var options = new FakeOptions { ArgumentsForConstructor = new object[] { 2, 2 } }; // Act this.fakeObjectCreator.CreateFake(typeof(TypeWithMultipleConstructors), options, session, throwOnFailure: false); // Assert A.CallTo(() => this.proxyGenerator.GenerateProxy(typeof(TypeWithMultipleConstructors), options.AdditionalInterfacesToImplement, A <IEnumerable <object> > .That.Not.IsThisSequence(2, 2), A <IFakeCallProcessorProvider> ._)) .MustNotHaveHappened(); }
public void Should_perform_actions_from_options_on_created_fake_when_trying_to_create_fake() { // Arrange object invokedWithFake = null; var options = new FakeOptions(); options.OnFakeCreatedActions.Add(x => invokedWithFake = x); var fake = A.Dummy <IFoo>(); A.CallTo(() => this.fakeCreator.CreateFake(typeof(IFoo), options, this.dummySession, false)) .Returns(fake); // Act this.manager.TryCreateFake(typeof(IFoo), options, out Ignore.This <object>().Value); // Assert Assert.That(invokedWithFake, Is.SameAs(fake)); }
public async Task GetFileTree(string filePath, FakeOptions <FileServiceSettings> settings, ICollection <string> files, FileViewModel expected) { using (var pathCreator = new PathCreator(files)) { pathCreator.CreateFiles(); var fileService = new FileService(new FakeLogger <FileService>(), settings); var response = await fileService.GetFileTree(pathCreator.GetFullPath(filePath)); var flatTreeResult = new List <FileViewModel>(); var flatTreeExpected = new List <FileViewModel>(); MakeTreeFlat(response.Item, flatTreeResult); MakeTreeFlat(expected, flatTreeExpected); var comparer = new FileViewModelComparer(); foreach (var expectedItem in flatTreeExpected) { Assert.Contains(expectedItem, flatTreeResult, comparer); } } }
public void Should_return_fake_when_successful() { // Arrange var argumentsForConstructor = new object[] { }; var options = new FakeOptions { AdditionalInterfacesToImplement = new Type[] { }, ArgumentsForConstructor = new object[] { } }; var proxy = A.Fake <IFoo>(); A.CallTo(() => this.proxyGenerator.GenerateProxy(typeof(IFoo), options.AdditionalInterfacesToImplement, options.ArgumentsForConstructor, A <IEnumerable <CustomAttributeBuilder> > ._)) .Returns(new ProxyGeneratorResult(proxy, A.Dummy <ICallInterceptedEventRaiser>())); // Act var createdFake = this.fakeObjectCreator.CreateFake(typeof(IFoo), options, A.Dummy <IDummyValueCreationSession>(), throwOnFailure: false); // Assert Assert.That(createdFake, Is.SameAs(proxy)); }
public static IEnumerable <object[]> GetFileData() { var setting = new FakeOptions <FileServiceSettings>(new FileServiceSettings { FileDelimeter = "\t", InitialPath = string.Empty, MaxLoadDepth = int.MaxValue }); return(new List <object[]> { new object[] { $"test.txt", setting, new string [][] { new string[] { "column1", "column2", "column3" }, new string[] { "item1", "item2", "item3" } } } }); }
public void Should_return_first_successfully_generated_proxy() { // Arrange var session = A.Fake <IDummyValueCreationSession>(); StubSessionWithDummyValue(session, 1); var options = new FakeOptions(); var proxy = A.Fake <IFoo>(); this.StubProxyGeneratorToFail(); A.CallTo(() => this.proxyGenerator.GenerateProxy(typeof(TypeWithMultipleConstructors), options.AdditionalInterfacesToImplement, A <IEnumerable <object> > .That.IsThisSequence(1, 1), A <IEnumerable <CustomAttributeBuilder> > ._, A <IFakeCallProcessorProvider> ._)) .Returns(new ProxyGeneratorResult(proxy)); A.CallTo(() => this.proxyGenerator.GenerateProxy(typeof(TypeWithMultipleConstructors), options.AdditionalInterfacesToImplement, A <IEnumerable <object> > .That.IsThisSequence(1), A <IEnumerable <CustomAttributeBuilder> > ._, A <IFakeCallProcessorProvider> ._)) .Returns(new ProxyGeneratorResult(new object())); // Act var createdFake = this.fakeObjectCreator.CreateFake(typeof(TypeWithMultipleConstructors), options, session, throwOnFailure: false); // Assert createdFake.Should().BeSameAs(proxy); }
public void Should_pass_fake_options_to_the_proxy_generator_and_return_the_fake_when_successful() { // Arrange var options = new FakeOptions(); var proxy = A.Fake <IFoo>(); A.CallTo(() => this.proxyGenerator.GenerateProxy(A <Type> ._, A <IEnumerable <Type> > ._, A <IEnumerable <object> > ._, A <IEnumerable <CustomAttributeBuilder> > ._, A <IFakeCallProcessorProvider> ._)) .Returns(new ProxyGeneratorResult(proxy)); // Act var createdFake = this.fakeObjectCreator.CreateFake(typeof(IFoo), options, A.Dummy <IDummyValueCreationSession>(), throwOnFailure: false); // Assert createdFake.Should().BeSameAs(proxy); A.CallTo(() => this.proxyGenerator.GenerateProxy( typeof(IFoo), options.AdditionalInterfacesToImplement, options.ArgumentsForConstructor, options.AdditionalAttributes, A <IFakeCallProcessorProvider> ._)) .MustHaveHappened(); }
public static void UnParsing_instance_returns_command_line(FakeOptions options, string result) { new Parser() .FormatCommandLine(options) .ShouldBeEquivalentTo(result); }
public static IEnumerable <object[]> GetFileTreeData() { var setting = new FakeOptions <FileServiceSettings>(new FileServiceSettings { FileDelimeter = "\t", InitialPath = string.Empty, MaxLoadDepth = int.MaxValue }); return(new List <object[]> { new object[] { $"testdir", setting, new List <string> { $"testdir", $"testdir\\testdir1_level1", $"testdir\\testdir1_level1\\testdir1_level2", $"testdir\\testdir1_level1\\testfile1_level2.txt", $"testdir\\testfile1_level1.txt" }, new FileViewModel { Name = $"testdir", IsDirectory = true, IsExpandable = true } .AddChild(new FileViewModel { Name = $"testdir\\testdir1_level1", IsDirectory = true, IsExpandable = true } .AddChild(new FileViewModel { Name = $"testdir\\testdir1_level1\\testdir1_level2", IsDirectory = true }) .AddChild(new FileViewModel { Name = $"testdir\\testdir1_level1\\testfile1_level2.txt" })) .AddChild(new FileViewModel { Name = $"testdir\\testfile1_level1.txt" }) }, new object[] { $"testdir2\\testdir1_level1", setting, new List <string> { $"testdir2", $"testdir2\\testdir1_level1", $"testdir2\\testdir1_level1\\testdir1_level2", $"testdir2\\testdir1_level1\\testfile1_level2.txt", $"testdir2\\testfile1_level1.txt" }, new FileViewModel { Name = $"testdir2\\testdir1_level1", IsDirectory = true, IsExpandable = true } .AddChild(new FileViewModel { Name = $"testdir2\\testdir1_level1\\testdir1_level2", IsDirectory = true }) .AddChild(new FileViewModel { Name = $"testdir2\\testdir1_level1\\testfile1_level2.txt" }) }, }); }