diff --git a/HwProj.NotificationsService/HwProj.NotificationsService.IntegrationTests/HwProj.NotificationsService.IntegrationTests.csproj b/HwProj.NotificationsService/HwProj.NotificationsService.IntegrationTests/HwProj.NotificationsService.IntegrationTests.csproj new file mode 100644 index 000000000..9f742092a --- /dev/null +++ b/HwProj.NotificationsService/HwProj.NotificationsService.IntegrationTests/HwProj.NotificationsService.IntegrationTests.csproj @@ -0,0 +1,29 @@ + + + + netcoreapp2.2 + enable + + false + + latest + + + + + + + + + + + + + + + + + + + + diff --git a/HwProj.NotificationsService/HwProj.NotificationsService.IntegrationTests/NotificationsService.IntegrationTests.cs b/HwProj.NotificationsService/HwProj.NotificationsService.IntegrationTests/NotificationsService.IntegrationTests.cs new file mode 100644 index 000000000..86c0a448c --- /dev/null +++ b/HwProj.NotificationsService/HwProj.NotificationsService.IntegrationTests/NotificationsService.IntegrationTests.cs @@ -0,0 +1,400 @@ +using System; +using System.Collections.Generic; +using System.Net.Http; +using System.Security.Claims; +using System.Threading; +using System.Threading.Tasks; +using AutoFixture; +using FluentAssertions; +using HwProj.AuthService.Client; +using HwProj.CoursesService.Client; +using HwProj.Models.AuthService.ViewModels; +using HwProj.Models.CoursesService.ViewModels; +using HwProj.Models.NotificationsService; +using HwProj.Models.SolutionsService; +using HwProj.NotificationsService.Client; +using HwProj.SolutionsService.Client; +using Microsoft.AspNetCore.Http; +using Microsoft.Extensions.Configuration; +using Microsoft.Extensions.Options; +using Moq; +using NUnit.Framework; + + +namespace HwProj.NotificationsService.IntegrationTests +{ + [TestFixture] + public class NotificationsServiceTests + { + private AuthServiceClient CreateAuthServiceClient() + { + var mockIConfiguration = new Mock(); + mockIConfiguration + .Setup(x => x.GetSection("Services")["Auth"]) + .Returns("http://localhost:5001"); + var mockClientFactory = new Mock(); + mockClientFactory + .Setup(x => x.CreateClient(Options.DefaultName)) + .Returns(new HttpClient()); + return new AuthServiceClient(mockClientFactory.Object, mockIConfiguration.Object); + } + + private NotificationsServiceClient CreateNotificationsServiceClient() + { + var mockIConfiguration = new Mock(); + mockIConfiguration + .Setup(x => x.GetSection("Services")["Notifications"]) + .Returns("http://localhost:5006"); + var mockClientFactory = new Mock(); + mockClientFactory + .Setup(x => x.CreateClient(Options.DefaultName)) + .Returns(new HttpClient()); + return new NotificationsServiceClient(mockClientFactory.Object, mockIConfiguration.Object); + } + + private CoursesServiceClient CreateCourseServiceClient(string userId) + { + var mockIConfiguration = new Mock(); + mockIConfiguration + .Setup(x => x.GetSection("Services")["Courses"]) + .Returns("http://localhost:5002"); + var mockClientFactory = new Mock(); + mockClientFactory + .Setup(x => x.CreateClient(Options.DefaultName)) + .Returns(new HttpClient()); + var mockHttpContextAccessor = new Mock(); + mockHttpContextAccessor + .Setup(x => x.HttpContext.User.FindFirst("_id")) + .Returns(new Claim("", userId)); + return new CoursesServiceClient(mockClientFactory.Object, mockHttpContextAccessor.Object, + mockIConfiguration.Object); + } + + private SolutionsServiceClient CreateSolutionsServiceClient() + { + var mockIConfiguration = new Mock(); + mockIConfiguration + .Setup(x => x.GetSection("Services")["Solutions"]) + .Returns("http://localhost:5007"); + var mockClientFactory = new Mock(); + mockClientFactory + .Setup(x => x.CreateClient(Options.DefaultName)) + .Returns(new HttpClient()); + return new SolutionsServiceClient(mockClientFactory.Object, mockIConfiguration.Object); + } + + private RegisterViewModel GenerateRegisterViewModel() + { + var password = new Fixture().Create(); + var fixture = new Fixture().Build() + .With(vm => vm.Password, password) + .With(vm => vm.PasswordConfirm, password); + var viewModel = fixture.Create(); + viewModel.Email += "@mail.ru"; + return viewModel; + } + + private CreateCourseViewModel GenerateCreateCourseViewModel() + => new Fixture().Build() + .With(c => c.IsOpen, true).Create(); + + private CreateHomeworkViewModel GenerateCreateHomeworkViewModel() + => new Fixture().Build() + .With(h => h.Tasks, new List()) + .Create(); + + private CreateTaskViewModel GenerateCreateTaskViewModel() + => new Fixture().Build() + .With(t => t.HasDeadline, false) + .With(t => t.IsDeadlineStrict, false) + .Create(); + + private SolutionViewModel GenerateSolutionViewModel(string studentId) + => new Fixture().Build() + .With(s => s.StudentId, studentId) + .Create(); + + private async Task<(string, string)> CreateAndRegisterUser() + { + var authClient = CreateAuthServiceClient(); + var userData = GenerateRegisterViewModel(); + await authClient.Register(userData); + var userId = await authClient.FindByEmailAsync(userData.Email); + return (userId, userData.Email); + } + private async Task<(string, string)> CreateAndRegisterLecture() + { + var (userId, mail) = await CreateAndRegisterUser(); + var authClient = CreateAuthServiceClient(); + await authClient.InviteNewLecturer(new InviteLecturerViewModel() {Email = mail}); + return (userId, mail); + } + + [Test] + public async Task NotificationRegisterTest() + { + var notificationClient = CreateNotificationsServiceClient(); + + var (studentId, _) = await CreateAndRegisterUser(); + var notification1 = await notificationClient.Get(studentId, new NotificationFilter()); + + notification1.Should().HaveCount(1); + notification1[0].Sender.Should().BeEquivalentTo("AuthService"); + } + + [Test] + public async Task GetMoreThanOneNotificationsTest() + { + var notificationClient = CreateNotificationsServiceClient(); + + var (studentId, _) = await CreateAndRegisterUser(); + var (lectureId, _) = await CreateAndRegisterLecture(); + var notificationAfterAcceptUser = await notificationClient.Get(studentId, new NotificationFilter()); + var studentCourseClient = CreateCourseServiceClient(studentId); + var lectureCourseClient = CreateCourseServiceClient(lectureId); + var course = GenerateCreateCourseViewModel(); + var courseId = await lectureCourseClient.CreateCourse(course, lectureId); + await studentCourseClient.SignInCourse(courseId, studentId); + await lectureCourseClient.AcceptStudent(courseId, studentId); + + var notificationBeforeAcceptUser = await notificationClient.Get(studentId, new NotificationFilter()); + while (notificationBeforeAcceptUser.Length != 2) + { + notificationBeforeAcceptUser = await notificationClient.Get(studentId, new NotificationFilter()); + } + + notificationAfterAcceptUser.Should().HaveCount(1); + notificationBeforeAcceptUser.Should().HaveCount(2); + } + + [Test] + public async Task NotificationAcceptLectureTest() + { + var (lectureId1, _) = await CreateAndRegisterLecture(); + var (lectureId2, lectureEmail2) = await CreateAndRegisterLecture(); + var lecture1CourseClient = CreateCourseServiceClient(lectureId1); + var course = GenerateCreateCourseViewModel(); + var courseId = await lecture1CourseClient.CreateCourse(course, lectureId1); + await lecture1CourseClient.AcceptLecturer(courseId, lectureEmail2); + + Thread.Sleep(5000); + var notificationClient = CreateNotificationsServiceClient(); + var notification = await notificationClient.Get(lectureId2, new NotificationFilter()); + + notification.Should().Contain(n => n.Sender == "AuthService"); + } + + [Test] + public async Task NotificationLectureAcceptOrRejectStudentTest() + { + var (lectureId1, _) = await CreateAndRegisterLecture(); + var (lectureId2, lectureEmail2) = await CreateAndRegisterLecture(); + var lecture1CourseClient = CreateCourseServiceClient(lectureId1); + var course = GenerateCreateCourseViewModel(); + var courseId = await lecture1CourseClient.CreateCourse(course, lectureId1); + await lecture1CourseClient.AcceptLecturer(courseId, lectureEmail2); + + Thread.Sleep(5000); + var notificationClient = CreateNotificationsServiceClient(); + var notification = await notificationClient.Get(lectureId2, new NotificationFilter()); + + notification.Should().Contain(n => n.Sender == "AuthService"); + } + + [Test] + public async Task NotificationNewCourseMateTest() + { + var (studentId, _) = await CreateAndRegisterUser(); + var (lectureId, _) = await CreateAndRegisterLecture(); + var (lectureId2, lectureEmail2) = await CreateAndRegisterLecture(); + var lectureCourseClient = CreateCourseServiceClient(lectureId); + var studentCourseClient = CreateCourseServiceClient(studentId); + var course = GenerateCreateCourseViewModel(); + var courseId = await lectureCourseClient.CreateCourse(course, lectureId); + await lectureCourseClient.AcceptLecturer(courseId, lectureEmail2); + await studentCourseClient.SignInCourse(courseId, studentId); + + Thread.Sleep(5000); + var notificationClient = CreateNotificationsServiceClient(); + var notificationLecture = await notificationClient.Get(lectureId, new NotificationFilter()); + var notificationLecture2 = await notificationClient.Get(lectureId2, new NotificationFilter()); + + notificationLecture.Should().Contain(n => n.Sender == "CourseService"); + notificationLecture2.Should().Contain(n => n.Sender == "CourseService"); + } + + [Test] + public async Task NotificationNewHomeworkTest() + { + var (studentId, _) = await CreateAndRegisterUser(); + var (studentId1, _) = await CreateAndRegisterUser(); + var (lectureId, _) = await CreateAndRegisterLecture(); + var lectureCourseClient = CreateCourseServiceClient(lectureId); + var studentCourseClient = CreateCourseServiceClient(studentId); + var student1CourseClient = CreateCourseServiceClient(studentId1); + var course = GenerateCreateCourseViewModel(); + var courseId = await lectureCourseClient.CreateCourse(course, lectureId); + await studentCourseClient.SignInCourse(courseId, studentId); + await lectureCourseClient.AcceptStudent(courseId, studentId); + await student1CourseClient.SignInCourse(courseId, studentId1); + await lectureCourseClient.AcceptStudent(courseId, studentId1); + + var hwCreateViewModel = GenerateCreateHomeworkViewModel(); + var taskCreateViewModel = GenerateCreateTaskViewModel(); + var homeworkId = await lectureCourseClient.AddHomeworkToCourse(hwCreateViewModel, courseId); + await lectureCourseClient.AddTask(taskCreateViewModel, homeworkId.Value); + + Thread.Sleep(5000); + var notificationClient = CreateNotificationsServiceClient(); + var notificationStudent = await notificationClient.Get(studentId, new NotificationFilter()); + var notificationStudent1 = await notificationClient.Get(studentId1, new NotificationFilter()); + + notificationStudent.Should().Contain(n => n.Sender == "CourseService"); + notificationStudent1.Should().Contain(n => n.Sender == "CourseService"); + } + + [Test] + public async Task NotificationUpdateHomeworkTest() + { + var (studentId, _) = await CreateAndRegisterUser(); + var (studentId1, _) = await CreateAndRegisterUser(); + var (lectureId, _) = await CreateAndRegisterLecture(); + var lectureCourseClient = CreateCourseServiceClient(lectureId); + var studentCourseClient = CreateCourseServiceClient(studentId); + var student1CourseClient = CreateCourseServiceClient(studentId1); + var course = GenerateCreateCourseViewModel(); + var courseId = await lectureCourseClient.CreateCourse(course, lectureId); + await studentCourseClient.SignInCourse(courseId, studentId); + await lectureCourseClient.AcceptStudent(courseId, studentId); + await student1CourseClient.SignInCourse(courseId, studentId1); + await lectureCourseClient.AcceptStudent(courseId, studentId1); + + var hwCreateViewModel = GenerateCreateHomeworkViewModel(); + var taskCreateViewModel = GenerateCreateTaskViewModel(); + var homeworkId = await lectureCourseClient.AddHomeworkToCourse(hwCreateViewModel, courseId); + hwCreateViewModel.Description = "Update"; + await lectureCourseClient.UpdateHomework(hwCreateViewModel, homeworkId.Value); + var taskId = await lectureCourseClient.AddTask(taskCreateViewModel, homeworkId.Value); + + Thread.Sleep(5000); + var notificationClient = CreateNotificationsServiceClient(); + var notificationStudent = await notificationClient.Get(studentId, new NotificationFilter()); + var notificationStudent1 = await notificationClient.Get(studentId1, new NotificationFilter()); + + var notificationBody = $"В курсе {course.Name} домашнее задание {hwCreateViewModel.Title} обновлено."; + + notificationStudent.Should().Contain(n => n.Body == notificationBody); + notificationStudent1.Should().Contain(n => n.Body == notificationBody); + } + + [Test] + public async Task NotificationUpdateTaskMaxRatingTest() + { + var (studentId, _) = await CreateAndRegisterUser(); + var (studentId1, _) = await CreateAndRegisterUser(); + var (lectureId, _) = await CreateAndRegisterLecture(); + var lectureCourseClient = CreateCourseServiceClient(lectureId); + var studentCourseClient = CreateCourseServiceClient(studentId); + var student1CourseClient = CreateCourseServiceClient(studentId1); + var course = GenerateCreateCourseViewModel(); + var courseId = await lectureCourseClient.CreateCourse(course, lectureId); + await studentCourseClient.SignInCourse(courseId, studentId); + await lectureCourseClient.AcceptStudent(courseId, studentId); + await student1CourseClient.SignInCourse(courseId, studentId1); + await lectureCourseClient.AcceptStudent(courseId, studentId1); + + var hwCreateViewModel = GenerateCreateHomeworkViewModel(); + var taskCreateViewModel = GenerateCreateTaskViewModel(); + var homeworkId = await lectureCourseClient.AddHomeworkToCourse(hwCreateViewModel, courseId); + var taskId = await lectureCourseClient.AddTask(taskCreateViewModel, homeworkId.Value); + taskCreateViewModel.Description = "Update"; + await lectureCourseClient.UpdateTask(taskCreateViewModel, taskId.Value); + + Thread.Sleep(5000); + var notificationClient = CreateNotificationsServiceClient(); + var notificationStudent = await notificationClient.Get(studentId, new NotificationFilter()); + var notificationStudent1 = await notificationClient.Get(studentId1, new NotificationFilter()); + + var notificationBody = $"Задача обновлена."; + + notificationStudent.Should().Contain(n => n.Body == notificationBody); + notificationStudent1.Should().Contain(n => n.Body == notificationBody); + } + + [Test] + public async Task NotificationStudentPassTaskTest() + { + var (studentId, _) = await CreateAndRegisterUser(); + var (lectureId, _) = await CreateAndRegisterLecture(); + var (lectureId2, lectureEmail2) = await CreateAndRegisterLecture(); + var lectureCourseClient = CreateCourseServiceClient(lectureId); + var studentCourseClient = CreateCourseServiceClient(studentId); + var course = GenerateCreateCourseViewModel(); + var courseId = await lectureCourseClient.CreateCourse(course, lectureId); + await lectureCourseClient.AcceptLecturer(courseId, lectureEmail2); + await studentCourseClient.SignInCourse(courseId, studentId); + await lectureCourseClient.AcceptStudent(courseId, studentId); + + var hwCreateViewModel = GenerateCreateHomeworkViewModel(); + var taskCreateViewModel = GenerateCreateTaskViewModel(); + var homeworkId = await lectureCourseClient.AddHomeworkToCourse(hwCreateViewModel, courseId); + var taskId = await lectureCourseClient.AddTask(taskCreateViewModel, homeworkId.Value); + var solutionViewModel = GenerateSolutionViewModel(studentId); + var solutionServiceClient = CreateSolutionsServiceClient(); + var solutionId = await solutionServiceClient.PostSolution(solutionViewModel, taskId.Value); + + Thread.Sleep(5000); + var notificationClient = CreateNotificationsServiceClient(); + var notificationLecture = await notificationClient.Get(lectureId, new NotificationFilter()); + var notificationLecture2 = await notificationClient.Get(lectureId2, new NotificationFilter()); + + notificationLecture.Should().Contain(n => n.Sender == "SolutionService"); + notificationLecture2.Should().Contain(n => n.Sender == "SolutionService"); + } + + [Test] + public async Task NotificationRateTest() + { + var (studentId, _) = await CreateAndRegisterUser(); + var (lectureId, _) = await CreateAndRegisterLecture(); + var lectureCourseClient = CreateCourseServiceClient(lectureId); + var studentCourseClient = CreateCourseServiceClient(studentId); + var course = GenerateCreateCourseViewModel(); + var courseId = await lectureCourseClient.CreateCourse(course, lectureId); + await studentCourseClient.SignInCourse(courseId, studentId); + await lectureCourseClient.AcceptStudent(courseId, studentId); + + var hwCreateViewModel = GenerateCreateHomeworkViewModel(); + var taskCreateViewModel = GenerateCreateTaskViewModel(); + var homeworkId = await lectureCourseClient.AddHomeworkToCourse(hwCreateViewModel, courseId); + var taskId = await lectureCourseClient.AddTask(taskCreateViewModel, homeworkId.Value); + var solutionViewModel = GenerateSolutionViewModel(studentId); + var solutionServiceClient = CreateSolutionsServiceClient(); + var solutionId = await solutionServiceClient.PostSolution(solutionViewModel, taskId.Value); + await solutionServiceClient.RateSolution(solutionId, 3, "", lectureId); + + Thread.Sleep(5000); + var notificationClient = CreateNotificationsServiceClient(); + var notificationLecture = await notificationClient.Get(studentId, new NotificationFilter()); + + notificationLecture.Should().Contain(n => n.Sender == "SolutionService"); + } + + [Test] + public async Task CheckMarkAsSeenTest() + { + var notificationClient = CreateNotificationsServiceClient(); + + var (userId, _) = await CreateAndRegisterUser(); + var notificationBefore = await notificationClient.Get(userId, new NotificationFilter()); + var notificationId = new long[1]{notificationBefore[0].Id}; + await notificationClient.MarkAsSeen(userId, notificationId); + var notificationAfter = await notificationClient.Get(userId, new NotificationFilter()); + + notificationBefore.Should().HaveCount(1); + notificationBefore[0].HasSeen.Should().BeFalse(); + notificationAfter.Should().HaveCount(1); + notificationAfter[0].HasSeen.Should().BeTrue(); + } + } +} \ No newline at end of file diff --git a/HwProj.NotificationsService/HwProj.NotificationsService.Tests/HwProj.NotificationsService.Tests.csproj b/HwProj.NotificationsService/HwProj.NotificationsService.Tests/HwProj.NotificationsService.Tests.csproj index f2af1e77f..b207bf4fa 100644 --- a/HwProj.NotificationsService/HwProj.NotificationsService.Tests/HwProj.NotificationsService.Tests.csproj +++ b/HwProj.NotificationsService/HwProj.NotificationsService.Tests/HwProj.NotificationsService.Tests.csproj @@ -11,10 +11,18 @@ + + + + + + + + diff --git a/HwProj.sln b/HwProj.sln index 786e01d33..b793a711c 100644 --- a/HwProj.sln +++ b/HwProj.sln @@ -40,6 +40,11 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "HwProj.APIGateway.API", "Hw {F584B68E-B6A8-46F1-A692-CB87DE9996BE} = {F584B68E-B6A8-46F1-A692-CB87DE9996BE} EndProjectSection EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "HwProj.AuthService.Tests", "HwProj.AuthService\HwProj.AuthService.Tests\HwProj.AuthService.Tests.csproj", "{34A014AB-BC00-4AFF-B08F-D8280734C869}" + ProjectSection(ProjectDependencies) = postProject + {7ECE830B-68EA-4BA3-BDEC-0D1E9FACB19A} = {7ECE830B-68EA-4BA3-BDEC-0D1E9FACB19A} + EndProjectSection +EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "HwProj.Models", "HwProj.Common\HwProj.Models\HwProj.Models.csproj", "{ECFA80DA-E0F5-4613-A15E-55FC8B9C8401}" EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "HwProj.AuthService.Client", "HwProj.AuthService\HwProj.AuthService.Client\HwProj.AuthService.Client.csproj", "{8F56C068-4827-412F-A29A-419B8AC5BECD}" @@ -64,6 +69,8 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "HwProj.SolutionsService.Cli EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "HwProj.Exceptions", "HwProj.Common\HwProj.Exceptions\HwProj.Exceptions.csproj", "{51463655-7668-4C7D-9FDE-D4D7CDAA82B8}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HwProj.NotificationsService.IntegrationTests", "HwProj.NotificationsService\HwProj.NotificationsService.IntegrationTests\HwProj.NotificationsService.IntegrationTests.csproj", "{E6370DC6-B123-4233-B95F-2C505EA47BF5}" +EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HwProj.AuthService.IntegrationTests", "HwProj.AuthService\HwProj.AuthService.IntegrationTests\HwProj.AuthService.IntegrationTests.csproj", "{EA822D2F-88C2-4B82-AA20-DD07FF0A9A1E}" EndProject Global @@ -112,6 +119,8 @@ Global {1407B364-9938-42C3-B061-30BE3F96FE02}.Debug|Any CPU.Build.0 = Debug|Any CPU {1407B364-9938-42C3-B061-30BE3F96FE02}.Release|Any CPU.ActiveCfg = Release|Any CPU {1407B364-9938-42C3-B061-30BE3F96FE02}.Release|Any CPU.Build.0 = Release|Any CPU + {34A014AB-BC00-4AFF-B08F-D8280734C869}.Release|Any CPU.ActiveCfg = Release|Any CPU + {34A014AB-BC00-4AFF-B08F-D8280734C869}.Release|Any CPU.Build.0 = Release|Any CPU {ECFA80DA-E0F5-4613-A15E-55FC8B9C8401}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {ECFA80DA-E0F5-4613-A15E-55FC8B9C8401}.Debug|Any CPU.Build.0 = Debug|Any CPU {ECFA80DA-E0F5-4613-A15E-55FC8B9C8401}.Release|Any CPU.ActiveCfg = Release|Any CPU @@ -154,8 +163,8 @@ Global {51463655-7668-4C7D-9FDE-D4D7CDAA82B8}.Release|Any CPU.Build.0 = Release|Any CPU {EA822D2F-88C2-4B82-AA20-DD07FF0A9A1E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {EA822D2F-88C2-4B82-AA20-DD07FF0A9A1E}.Debug|Any CPU.Build.0 = Debug|Any CPU - {EA822D2F-88C2-4B82-AA20-DD07FF0A9A1E}.Release|Any CPU.ActiveCfg = Release|Any CPU - {EA822D2F-88C2-4B82-AA20-DD07FF0A9A1E}.Release|Any CPU.Build.0 = Release|Any CPU + {E6370DC6-B123-4233-B95F-2C505EA47BF5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {E6370DC6-B123-4233-B95F-2C505EA47BF5}.Debug|Any CPU.Build.0 = Debug|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -171,6 +180,7 @@ Global {2B4D695D-1BAA-4BCC-AE5A-C1CDD4ACCCCA} = {1EAEB779-E7C8-4EF9-B9A9-22CB8E3C246D} {7ECE830B-68EA-4BA3-BDEC-0D1E9FACB19A} = {D7F8BC73-A6CB-4E07-984D-2D65B740BC69} {1407B364-9938-42C3-B061-30BE3F96FE02} = {DC0D1EE7-D2F8-4D15-8CC6-69A0A0A938D9} + {34A014AB-BC00-4AFF-B08F-D8280734C869} = {D7F8BC73-A6CB-4E07-984D-2D65B740BC69} {ECFA80DA-E0F5-4613-A15E-55FC8B9C8401} = {77D857A8-45C6-4432-B4BF-A2F2C9ECA7FE} {8F56C068-4827-412F-A29A-419B8AC5BECD} = {D7F8BC73-A6CB-4E07-984D-2D65B740BC69} {0A9B7E03-680B-4BAC-9599-87AB5219D376} = {CB37F9AC-88CB-425C-8200-1B40F372F38D} @@ -182,6 +192,7 @@ Global {C1ACAB32-4100-4C19-AE08-57FA9BA75DF2} = {A85A3030-2878-4923-B450-9683832CDAC1} {51463655-7668-4C7D-9FDE-D4D7CDAA82B8} = {77D857A8-45C6-4432-B4BF-A2F2C9ECA7FE} {EA822D2F-88C2-4B82-AA20-DD07FF0A9A1E} = {D7F8BC73-A6CB-4E07-984D-2D65B740BC69} + {E6370DC6-B123-4233-B95F-2C505EA47BF5} = {1EAEB779-E7C8-4EF9-B9A9-22CB8E3C246D} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {C03BF138-4A5B-4261-9495-6D3AC6CE9779}