public void CalculateChangesRemovingOldGenderOnAccountStillHiddenMarksProfileAsChangedTest()
        {
            var original = Model.Create <Profile>().Set(x => x.BannedAt = null)
                           .Set(x => x.Status = ProfileStatus.Hidden);
            var updated = original.Clone().Set(x => x.Gender = null);

            var sut = new ProfileChangeCalculator();

            var actual = sut.CalculateChanges(original, updated);

            actual.ProfileChanged.Should().BeTrue();
            actual.CategoryChanges.Should().BeEmpty();
        }
        CalculateChangesMarksProfileChangedWithNoCategoryChangesWhenStatusChangedBetweenAvailableAndUnavailableTest(
            ProfileStatus originalValue,
            ProfileStatus updatedValue)
        {
            var original = Model.Create <Profile>().Set(x => x.Status = originalValue);
            var updated  = original.Clone().Set(x => x.Status = updatedValue);

            var sut = new ProfileChangeCalculator();

            var actual = sut.CalculateChanges(original, updated);

            actual.ProfileChanged.Should().BeTrue();
            actual.CategoryChanges.Should().BeEmpty();
        }
        public void CalculateChangesCorrectlyIdentifiesChangesToStatusTest(
            ProfileStatus originalValue,
            ProfileStatus updatedValue,
            bool expected)
        {
            var original = Model.Create <Profile>().Set(x => x.Status = originalValue);
            var updated  = original.Clone().Set(x => x.Status = updatedValue);

            var sut = new ProfileChangeCalculator();

            var actual = sut.CalculateChanges(original, updated);

            actual.ProfileChanged.Should().Be(expected);
        }
        public void CalculateChangesAddingGenderOnBannedAccountMarksProfileAsChangedTest()
        {
            var original = Model.Create <Profile>().Set(x => x.BannedAt = DateTimeOffset.UtcNow)
                           .Set(x => x.Status = ProfileStatus.Available)
                           .Set(x => x.Gender = null);
            var updated = original.Clone().Set(x => x.Gender = "Female");

            var sut = new ProfileChangeCalculator();

            var actual = sut.CalculateChanges(original, updated);

            actual.ProfileChanged.Should().BeTrue();
            actual.CategoryChanges.Should().BeEmpty();
        }
        public void CalculateChangesDetectsChangesToGenderTest(
            string originalValue,
            string updatedValue,
            bool isChanged,
            bool isAdded,
            bool isRemoved,
            string scenario)
        {
            _output.WriteLine("{0}: [{1}], [{2}]", scenario, originalValue ?? "null", updatedValue ?? "null");

            var original = Model.Create <Profile>().Set(x => x.Gender = originalValue).Set(x => x.BannedAt = null)
                           .Set(x => x.Status = ProfileStatus.Available);
            var updated = original.Clone().Set(x => x.Gender = updatedValue);

            var sut = new ProfileChangeCalculator();

            var actual = sut.CalculateChanges(original, updated);

            actual.ProfileChanged.Should().Be(isChanged);

            if (isAdded == false &&
                isRemoved == false)
            {
                actual.CategoryChanges.Should().BeEmpty();
            }
            else if (isAdded && isRemoved)
            {
                actual.CategoryChanges.Should().HaveCount(2);
                actual.CategoryChanges.All(x => x.CategoryGroup == CategoryGroup.Gender).Should().BeTrue();
                actual.CategoryChanges.Should().Contain(
                    x => x.ChangeType == CategoryLinkChangeType.Remove && x.CategoryName == originalValue);
                actual.CategoryChanges.Should().Contain(
                    x => x.ChangeType == CategoryLinkChangeType.Add && x.CategoryName == updatedValue);
            }
            else if (isAdded)
            {
                actual.CategoryChanges.Should().HaveCount(1);
                actual.CategoryChanges.All(x => x.CategoryGroup == CategoryGroup.Gender).Should().BeTrue();
                actual.CategoryChanges.Should().Contain(
                    x => x.ChangeType == CategoryLinkChangeType.Add && x.CategoryName == updatedValue);
            }
            else
            {
                actual.CategoryChanges.Should().HaveCount(1);
                actual.CategoryChanges.All(x => x.CategoryGroup == CategoryGroup.Gender).Should().BeTrue();
                actual.CategoryChanges.Should().Contain(
                    x => x.ChangeType == CategoryLinkChangeType.Remove && x.CategoryName == originalValue);
            }
        }
        public void CalculateChangesCorrectlyIdentifiesChangesToStringPropertiesTest(
            Profile original,
            Profile updated,
            bool expected,
            string scenario)
        {
            _output.WriteLine(scenario);

            var sut = new ProfileChangeCalculator();

            var actual = sut.CalculateChanges(original, updated);

            actual.CategoryChanges.Should().BeEmpty();
            actual.ProfileChanged.Should().Be(expected);
        }
        public void CalculateChangesSetsProfileAsChangedButWithoutCategoryChangesWhenProfileIsBannedTest()
        {
            var original = Model.Create <Profile>().Set(x => x.BannedAt = DateTimeOffset.UtcNow);
            var updated  = original.Clone();
            var skill    = Model.Create <Skill>();

            updated.Skills.Add(skill);

            var sut = new ProfileChangeCalculator();

            var actual = sut.CalculateChanges(original, updated);

            actual.ProfileChanged.Should().BeTrue();
            actual.CategoryChanges.Should().BeEmpty();
        }
        public void CalculateChangesRemovingOldSkillOnBannedAccountMarksProfileAsChangedTest()
        {
            var original = Model.Create <Profile>().Set(x => x.BannedAt = DateTimeOffset.UtcNow)
                           .Set(x => x.Status = ProfileStatus.Available);
            var updated = original.Clone();
            var skill   = Model.Create <Skill>();

            original.Skills.Add(skill);

            var sut = new ProfileChangeCalculator();

            var actual = sut.CalculateChanges(original, updated);

            actual.ProfileChanged.Should().BeTrue();
            actual.CategoryChanges.Should().BeEmpty();
        }
        public void CalculateChangesAddingLanguageOnBannedAccountMarksProfileAsChangedTest()
        {
            var original = Model.Create <Profile>().Set(x => x.BannedAt = DateTimeOffset.UtcNow)
                           .Set(x => x.Status = ProfileStatus.Available);
            var updated  = original.Clone();
            var language = Guid.NewGuid().ToString();

            updated.Languages.Add(language);

            var sut = new ProfileChangeCalculator();

            var actual = sut.CalculateChanges(original, updated);

            actual.ProfileChanged.Should().BeTrue();
            actual.CategoryChanges.Should().BeEmpty();
        }
        public void CalculateChangesIgnoresLanguageDifferentByCaseOnlyTest()
        {
            var original = Model.Create <Profile>().Set(x => x.BannedAt = null)
                           .Set(x => x.Status = ProfileStatus.Available);
            var updated  = original.Clone();
            var language = Guid.NewGuid().ToString();

            original.Languages.Add(language.ToLowerInvariant());
            updated.Languages.Add(language.ToUpperInvariant());

            var sut = new ProfileChangeCalculator();

            var actual = sut.CalculateChanges(original, updated);

            actual.ProfileChanged.Should().BeFalse();
            actual.CategoryChanges.Should().BeEmpty();
        }
        public void CalculateChangesIgnoresSkillNameDifferentByCaseOnlyTest()
        {
            var original = Model.Create <Profile>().Set(x => x.BannedAt = null)
                           .Set(x => x.Status = ProfileStatus.Available);
            var updated  = original.Clone();
            var oldSkill = Model.Create <Skill>().Set(x => x.Name = x.Name.ToLowerInvariant());
            var newSkill = oldSkill.Clone().Set(x => x.Name = oldSkill.Name.ToUpperInvariant());

            original.Skills.Add(oldSkill);
            updated.Skills.Add(newSkill);

            var sut = new ProfileChangeCalculator();

            var actual = sut.CalculateChanges(original, updated);

            actual.ProfileChanged.Should().BeFalse();
            actual.CategoryChanges.Should().BeEmpty();
        }
        public void RemoveAllCategoryLinksDeterminesGenderChangeTest(string gender, bool removeExpected)
        {
            var profile = Model.Create <Profile>().Set(x => x.Gender = gender);

            var sut = new ProfileChangeCalculator();

            var actual = sut.RemoveAllCategoryLinks(profile);

            if (removeExpected)
            {
                actual.CategoryChanges.Should().Contain(
                    x => x.CategoryGroup == CategoryGroup.Gender && x.CategoryName == gender);
            }
            else
            {
                actual.CategoryChanges.Should().NotContain(
                    x => x.CategoryGroup == CategoryGroup.Gender && x.CategoryName == gender);
            }
        }
        public void RemoveAllCategoryLinksDeterminesSkillAndLanguageChangesTest()
        {
            var profile = Model.Create <Profile>();

            var sut = new ProfileChangeCalculator();

            var actual = sut.RemoveAllCategoryLinks(profile);

            foreach (var language in profile.Languages)
            {
                actual.CategoryChanges.Should().Contain(
                    x => x.CategoryGroup == CategoryGroup.Language && x.CategoryName == language);
            }

            foreach (var skill in profile.Skills)
            {
                actual.CategoryChanges.Should().Contain(
                    x => x.CategoryGroup == CategoryGroup.Skill && x.CategoryName == skill.Name);
            }
        }
        public void CalculateChangesSetsProfileAsChangedWithoutCategoryChangeWhenYearLastUsedChangesTest(
            int?originalValue,
            int?updatedValue,
            bool expected)
        {
            var original = Model.Create <Profile>().Set(x => x.BannedAt = null)
                           .Set(x => x.Status = ProfileStatus.Available);
            var updated       = original.Clone();
            var originalSkill = Model.Create <Skill>().Set(x => x.YearLastUsed = originalValue);
            var updatedSkill  = originalSkill.Clone().Set(x => x.YearLastUsed = updatedValue);

            original.Skills.Add(originalSkill);
            updated.Skills.Add(updatedSkill);

            var sut = new ProfileChangeCalculator();

            var actual = sut.CalculateChanges(original, updated);

            actual.ProfileChanged.Should().Be(expected);
            actual.CategoryChanges.Should().BeEmpty();
        }
        public void CalculateChangesIgnoresNewCategoriesWhenStatusChangedToHiddenTest(ProfileStatus status)
        {
            var original = Model.Create <Profile>().Set(x => x.BannedAt = null)
                           .Set(x => x.Status = status)
                           .Set(x => x.Skills.Clear())
                           .Set(x => x.Languages.Clear())
                           .Set(x => x.Gender = null);
            var updated = original.Clone().Set(x => x.Status = ProfileStatus.Hidden);
            var skill   = Model.Create <Skill>();

            updated.Skills.Add(skill);
            updated.Languages.Add(Guid.NewGuid().ToString());
            updated.Gender = Guid.NewGuid().ToString();

            var sut = new ProfileChangeCalculator();

            var actual = sut.CalculateChanges(original, updated);

            actual.ProfileChanged.Should().BeTrue();
            actual.CategoryChanges.Should().HaveCount(0);
        }
        public void CalculateChangesAddsNewLanguageTest()
        {
            var original = Model.Create <Profile>().Set(x => x.BannedAt = null)
                           .Set(x => x.Status = ProfileStatus.Available);
            var updated  = original.Clone();
            var language = Guid.NewGuid().ToString();

            updated.Languages.Add(language);

            var sut = new ProfileChangeCalculator();

            var actual = sut.CalculateChanges(original, updated);

            actual.ProfileChanged.Should().BeTrue();
            actual.CategoryChanges.Should().HaveCount(1);

            var change = actual.CategoryChanges.First();

            change.CategoryGroup.Should().Be(CategoryGroup.Language);
            change.CategoryName.Should().Be(language);
            change.ChangeType.Should().Be(CategoryLinkChangeType.Add);
        }
        public void CalculateChangesRemovesOldSkillTest()
        {
            var original = Model.Create <Profile>().Set(x => x.BannedAt = null)
                           .Set(x => x.Status = ProfileStatus.Available);
            var updated = original.Clone();
            var skill   = Model.Create <Skill>();

            original.Skills.Add(skill);

            var sut = new ProfileChangeCalculator();

            var actual = sut.CalculateChanges(original, updated);

            actual.ProfileChanged.Should().BeTrue();
            actual.CategoryChanges.Should().HaveCount(1);

            var change = actual.CategoryChanges.First();

            change.CategoryGroup.Should().Be(CategoryGroup.Skill);
            change.CategoryName.Should().Be(skill.Name);
            change.ChangeType.Should().Be(CategoryLinkChangeType.Remove);
        }
        public void CalculateChangesSetsProfileAsChangedWithCategoryChangeWhenSkillLevelChangesTest(
            SkillLevel originalLevel,
            SkillLevel updatedLevel,
            bool expected)
        {
            var original = Model.Create <Profile>().Set(x => x.BannedAt = null)
                           .Set(x => x.Status = ProfileStatus.Available);
            var updated       = original.Clone();
            var originalSkill = Model.Create <Skill>().Set(x => x.Level = originalLevel);
            var updatedSkill  = originalSkill.Clone().Set(x => x.Level = updatedLevel);

            original.Skills.Clear();
            updated.Skills.Clear();
            original.Skills.Add(originalSkill);
            updated.Skills.Add(updatedSkill);

            var sut = new ProfileChangeCalculator();

            var actual = sut.CalculateChanges(original, updated);

            actual.ProfileChanged.Should().Be(expected);
            actual.CategoryChanges.Should().BeEmpty();
        }