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'");
        }
예제 #2
0
        /// <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");
        }