public void LoadCourseTest() { const string providerCode = "PR1"; const string campusCode = "C"; Provider provider = new Provider { ProviderCode = providerCode }; var providers = new Dictionary <string, Provider> { [providerCode] = provider }; var subjects = new Dictionary <string, Subject>(); var pgdeCourses = new List <PgdeCourse>(); var courseLoader = new CourseLoader(providers, subjects, pgdeCourses, MockClock.Object); var courseRecords = new List <UcasCourse> { new UcasCourse { CrseCode = "CRS1", CampusCode = campusCode, InstCode = providerCode }, new UcasCourse { CrseCode = "CRS2", CampusCode = campusCode, InstCode = providerCode, Modular = "" }, new UcasCourse { CrseCode = "CRS3", CampusCode = campusCode, InstCode = providerCode, Modular = "M" } }; var courseSubjects = new List <UcasCourseSubject>(); var allSites = new List <Site> { new Site { Provider = provider, Code = campusCode } }; var returnedCourses = courseLoader.LoadCourses(provider, courseRecords, courseSubjects, allSites); returnedCourses.Should().HaveCount(3, "3 courses were passed in"); returnedCourses[0].Modular.Should().Be(null, "The first course doesn't specify Modular"); returnedCourses[1].Modular.Should().Be("", "The second course has an empty string Modular"); returnedCourses[2].Modular.Should().Be("M", "The third course has a defined Modular of 'M'"); }
/// <summary> /// Processes data in the payload object into the database as an upsert/delta /// </summary> public void UpdateUcasData() { var allCampusesGrouped = payload.Campuses.GroupBy(x => x.InstCode).ToDictionary(x => x.Key); var ucasSubjects = payload.Subjects.ToList(); var pgdeCourses = new List <PgdeCourse>(); var ucasCourseGroupings = payload.Courses.GroupBy(x => x.InstCode).ToDictionary(x => x.Key); var ucasCourseSubjectGroupings = payload.CourseSubjects.GroupBy(x => x.InstCode).ToDictionary(x => x.Key); _logger.Warning("Beginning UCAS import"); _logger.Information($"Upserting {payload.Institutions.Count()} institutions"); var allSubjects = new Dictionary <string, Subject>(); MigrateOnce("upsert subjects", () => { foreach (var s in payload.Subjects) { var savedSubject = UpsertSubject(new Subject { SubjectName = s.SubjectDescription, SubjectCode = s.SubjectCode }); allSubjects[savedSubject.SubjectCode] = savedSubject; } }); var providerCache = _context.Providers .Include(x => x.Sites) .Include(x => x.Courses) .ToDictionary(p => p.ProviderCode); MigratePerProvider("upsert providers", providerCache, inst => { var savedProvider = UpsertProvider(ToProvider(inst), providerCache); _context.Save(); // update/add cached copy providerCache[savedProvider.ProviderCode] = savedProvider; }); var courseLoader = new CourseLoader(providerCache, allSubjects, pgdeCourses, _clock); MigratePerProvider("drop-and-create sites and courses", providerCache, ucasInst => { var inst = providerCache[ucasInst.InstCode]; DeleteForProvider(inst.ProviderCode); _context.Save(); var campuses = allCampusesGrouped.ContainsKey(inst.ProviderCode) ? allCampusesGrouped[inst.ProviderCode] : null; IEnumerable <Site> sites = new List <Site>(); if (campuses != null) { inst.Sites = inst.Sites ?? new Collection <Site>(); sites = campuses.Select(x => ToSite(x)).ToList(); foreach (var site in (IEnumerable <Site>)sites) { inst.Sites.Add(site); site.Provider = inst; } _context.Save(); } var allCoursesForThisProvider = courseLoader.LoadCourses( inst, ucasCourseGroupings.GetValueOrDefault(inst.ProviderCode).AsEnumerable() ?? new List <UcasCourse>(), ucasCourseSubjectGroupings.GetValueOrDefault(inst.ProviderCode).AsEnumerable() ?? new List <UcasCourseSubject>(), sites); inst.Courses = new Collection <Course>(allCoursesForThisProvider.ToList()); _context.Save(); }); _logger.Warning("Completed UCAS import"); }