public async Task When_Insert_Complex_Users_Then_Information_Are_Correct()
        {
            // ARRANGE
            InitializeFakeObjects();
            var jArr = new JArray();

            jArr.Add("a1");
            jArr.Add("a2");
            var jObj = new JObject();

            jObj.Add(Common.Constants.NameResponseNames.MiddleName, "middlename");
            jObj.Add(Common.Constants.NameResponseNames.GivenName, "givename");
            var complexArr = new JArray();
            var complexObj = new JObject();

            complexObj.Add("test", "test2");
            complexArr.Add(complexObj);
            _httpClientFactoryStub.Setup(h => h.GetHttpClient()).Returns(_testScimServerFixture.Client);
            var firstResult = await _usersClient.AddUser(baseUrl)
                              .AddAttribute(new JProperty(Common.Constants.UserResourceResponseNames.UserName, "username"))
                              .AddAttribute(new JProperty("arr", jArr))
                              .AddAttribute(new JProperty("date", DateTime.UtcNow))
                              .AddAttribute(new JProperty("age", 23))
                              .AddAttribute(new JProperty("complexarr", complexArr))
                              .AddAttribute(new JProperty(Common.Constants.UserResourceResponseNames.Name, jObj))
                              .Execute();

            var id = firstResult.Content["id"].ToString();

            var firstSearch = await _usersClient.SearchUsers(baseUrl, new SearchParameter
            {
                StartIndex = 0,
                Count      = 10,
                Filter     = $"arr co a1"
            });

            var secondSearch = await _usersClient.SearchUsers(baseUrl, new SearchParameter
            {
                StartIndex = 0,
                Count      = 10,
                Filter     = $"complexarr[test eq test2]"
            });

            var thirdSearch = await _usersClient.SearchUsers(baseUrl, new SearchParameter
            {
                StartIndex = 0,
                Count      = 10,
                Filter     = $"age le 23"
            });

            var newDate      = DateTime.UtcNow.AddDays(2).ToUnix().ToString();
            var fourthSearch = await _usersClient.SearchUsers(baseUrl, new SearchParameter
            {
                StartIndex = 0,
                Count      = 10,
                Filter     = $"date lt {newDate}"
            });

            Assert.NotNull(firstSearch);
            Assert.NotNull(secondSearch);
            Assert.NotNull(thirdSearch);
            Assert.NotNull(fourthSearch);

            var eightResult = await _usersClient.DeleteUser(baseUrl, id);
        }
        public async Task When_Executing_Operations_On_Users_Then_No_Exceptions_Are_Thrown()
        {
            const string baseUrl = "http://*****:*****@example.com'}, {'" + Common.Constants.MultiValueAttributeNames.Type + "' : 'home','" + Common.Constants.MultiValueAttributeNames.Value + "' : '*****@*****.**'}]"))
                                     .Build();
            var removeEmailOperation = new PatchOperationBuilder().SetType(PatchOperations.remove)
                                       .SetPath("emails[type eq work]")
                                       .Build();

            // ACT : Create user
            var firstResult = await _usersClient.AddUser(baseUrl)
                              .SetCommonAttributes("external_id")
                              .AddAttribute(new JProperty(Common.Constants.UserResourceResponseNames.UserName, "username"))
                              .Execute();

            // ASSERTS
            Assert.NotNull(firstResult);
            Assert.True(firstResult.StatusCode == HttpStatusCode.Created);
            var id = firstResult.Content["id"].ToString();

            // ACT : Partial update user
            var secondResult = await _usersClient.PartialUpdateUser(baseUrl, id)
                               .AddOperation(patchOperation)
                               .Execute();

            // ASSERTS
            Assert.NotNull(secondResult);
            Assert.True(secondResult.Content[Common.Constants.UserResourceResponseNames.UserName].ToString() == "new_username");

            // ACT : Update user
            var thirdResult = await _usersClient.UpdateUser(baseUrl, id)
                              .SetCommonAttributes("new_external_id")
                              .AddAttribute(new JProperty(Common.Constants.UserResourceResponseNames.UserName, "other_username"))
                              .AddAttribute(new JProperty(Common.Constants.UserResourceResponseNames.Active, "false"))
                              .Execute();

            // ASSERTS
            Assert.NotNull(thirdResult);
            Assert.True(thirdResult.StatusCode == HttpStatusCode.OK);
            Assert.True(thirdResult.Content[Common.Constants.UserResourceResponseNames.UserName].ToString() == "other_username");
            var active = thirdResult.Content[Common.Constants.UserResourceResponseNames.Active].ToString();

            Assert.False(bool.Parse(active));
            Assert.True(thirdResult.Content[Common.Constants.IdentifiedScimResourceNames.ExternalId].ToString() == "new_external_id");

            // ACT : Add emails to the user
            var fourthResult = await _usersClient.PartialUpdateUser(baseUrl, id)
                               .AddOperation(addEmailsOperation)
                               .Execute();

            // ASSERTS
            Assert.NotNull(fourthResult);
            Assert.True(fourthResult.StatusCode == HttpStatusCode.OK);
            Assert.True(fourthResult.Content[Common.Constants.UserResourceResponseNames.Emails].Count() == 2);

            /*
             * // ACT : Remove emails of the user
             * var fifthResult = await _usersClient.PartialUpdateUser(baseUrl, id)
             *  .AddOperation(removeEmailOperation)
             *  .Execute();
             *
             * // ASSERTS
             * Assert.NotNull(fifthResult);
             * Assert.True(fifthResult.StatusCode == HttpStatusCode.OK);
             * Assert.True(fifthResult.Content[Common.Constants.UserResourceResponseNames.Emails].Count() == 1);
             */

            // ACT : Add 10 users
            for (int i = 0; i < 10; i++)
            {
                await _usersClient.AddUser(baseUrl)
                .SetCommonAttributes(Guid.NewGuid().ToString())
                .AddAttribute(new JProperty(Common.Constants.UserResourceResponseNames.UserName, Guid.NewGuid().ToString()))
                .Execute();
            }

            // ACT : Get 10 users
            var sixResult = await _usersClient.SearchUsers(baseUrl, new SearchParameter
            {
                StartIndex = 1,
                Count      = 10
            });

            // ASSERTS
            Assert.NotNull(sixResult);
            Assert.True(sixResult.Content["Resources"].Count() == 10);

            // ACT : Get only emails
            var sevenResult = await _usersClient.SearchUsers(baseUrl, new SearchParameter
            {
                Filter     = "emails[type pr]",
                Attributes = new[] { "emails.type", "emails.value", "emails.display", "userName" }
            });

            // ASSERTS
            Assert.NotNull(sevenResult);

            // ACT : Remove the user
            var eightResult = await _usersClient.DeleteUser(baseUrl, id);

            // ASSERTS
            Assert.NotNull(eightResult);
            Assert.True(eightResult.StatusCode == HttpStatusCode.NoContent);
        }