Example #1
0
        public async Task ExportsController_GetCoursesPartialTest()
        {
            AuthenticationHelper.HttpContext = AuthenticationHelper.CreateHttpContext(true);
            ExportsController controller = new ExportsController();

            SetupController(controller);
            ExportsViewModel defaultExportViewModel = await GetDefaultExportsViewModel();

            var defaultResult = await controller.Index();

            Assert.IsNotNull(defaultResult, "invalid result");
            Assert.IsInstanceOfType(defaultResult, typeof(ViewResult), "Unexpected result type");
            ViewResult defaultViewResult = defaultResult as ViewResult;

            Assert.IsNotNull(defaultViewResult.Model, "Invalid model result");
            Assert.IsInstanceOfType(defaultViewResult.Model, typeof(ExportsViewModel), "Unexpected model type");
            ExportsViewModel modelResult = defaultViewResult.Model as ExportsViewModel;
            var schoolIds     = modelResult.SchoolsCriteriaSection.FilterCheckboxes.Select(p => p.SchoolId).ToList();
            var partialResult = await controller.GetPreviewCoursesJsonString(0);

            Assert.IsNotNull(partialResult, "Invalid result");
            Assert.IsInstanceOfType(partialResult, typeof(JsonResult), "Unexpected result type");
            JsonResult partialViewResult = partialResult as JsonResult;

            Assert.IsNotNull(partialViewResult.Data, "Invalid model");
            Assert.IsInstanceOfType(partialViewResult.Data, typeof(ViewModels.DataPreviewPagedJsonModel), "Unexpected model type");
            ViewModels.DataPreviewPagedJsonModel apiCriteriaResult = partialViewResult.Data as ViewModels.DataPreviewPagedJsonModel;
            Assert.IsTrue(apiCriteriaResult.TotalPages > 0, "No data found");
        }
        public ActionResult UpdateTemplate(ExportsViewModel model)
        {
            var schoolIds = model.SelectedSchools?.Split(',').ToList();
            //var schoolYears = model.SelectedSchoolYears?.Split(',').ToList();
            //var terms = model.SelectedTerms?.Split(',').ToList();
            //var subjects = model.SelectedSubjects?.Split(',').ToList();
            //var courses = model.SelectedCourses?.Split(',').ToList();
            var teachers = model.SelectedTeachers?.Split(',').ToList();
            var sections = model.SelectedSections?.Split(',').ToList();

            var inputs = new FilterInputs
            {
                Schools = schoolIds,
                //SchoolYears = schoolYears,
                //Terms = terms,
                //Subjects = subjects,
                //Courses = courses,
                Teachers = teachers,
                Sections = sections
            };

            var inputsJson = JsonConvert.SerializeObject(inputs);

            var template = db.Templates.First(x => x.TemplateId == model.EditTemplateId);

            template.Filters          = inputsJson;
            template.OneRosterVersion = model.OneRosterVersion;

            db.SaveChanges(UserName, IpAddress);

            return(RedirectToAction("Index", "Templates"));
        }
Example #3
0
        public async Task ExportsController_GetSectionsPartialTest()
        {
            AuthenticationHelper.HttpContext = AuthenticationHelper.CreateHttpContext(true);
            ExportsController controller = new ExportsController();

            SetupController(controller);
            ExportsViewModel defaultExportViewModel = await GetDefaultExportsViewModel();

            var defaultResult = await controller.Index();

            Assert.IsNotNull(defaultResult, "invalid result");
            Assert.IsInstanceOfType(defaultResult, typeof(ViewResult), "Unexpected result type");
            ViewResult defaultViewResult = defaultResult as ViewResult;

            Assert.IsNotNull(defaultViewResult.Model, "Invalid model result");
            Assert.IsInstanceOfType(defaultViewResult.Model, typeof(ExportsViewModel), "Unexpected model type");
            ExportsViewModel modelResult = defaultViewResult.Model as ExportsViewModel;
            var schoolIds     = modelResult.SchoolsCriteriaSection.FilterCheckboxes.Select(p => p.SchoolId).ToList();
            var partialResult = await controller.GetSectionsPartial(schoolIds : schoolIds, boxesAlreadyChecked : null, getMore : false);

            Assert.IsNotNull(partialResult, "Invalid result");
            Assert.IsInstanceOfType(partialResult, typeof(PartialViewResult), "Unexpected result type");
            PartialViewResult partialViewResult = partialResult as PartialViewResult;

            Assert.IsNotNull(partialViewResult.Model, "Invalid model");
            Assert.IsInstanceOfType(partialViewResult.Model, typeof(ApiCriteriaSection), "Unexpected model type");
            ApiCriteriaSection apiCriteriaResult = partialViewResult.Model as ApiCriteriaSection;

            Assert.IsTrue(apiCriteriaResult.FilterCheckboxes.Count > 0, "No data found");
        }
Example #4
0
        public async Task ExportsController_PreviewTest()
        {
            Assert.Inconclusive("Unit test has infinite looping");
            AuthenticationHelper.HttpContext = AuthenticationHelper.CreateHttpContext(true);
            ExportsController exportsController = new ExportsController();

            SetupController(exportsController);
            ExportsViewModel defaultExportsViewModel = await GetDefaultExportsViewModel();

            var previewResult = await exportsController.Preview(
                schoolIds : defaultExportsViewModel.SelectedSchools.Split(',').ToList(),
                //schoolYears: null,
                //terms: null,
                //subjects: null,
                //courses: defaultExportsViewModel.SelectedCourses.Split(',').ToList(),
                teachers : null,
                sections : null,
                oneRosterVersion : null
                );

            Assert.IsNotNull(previewResult, "Invalid result");
            Assert.IsInstanceOfType(previewResult, typeof(PartialViewResult), "Invalid result type");
            PartialViewResult partialViewResult = previewResult as PartialViewResult;

            Assert.IsNotNull(partialViewResult.Model, "Invalid model");
            Assert.IsInstanceOfType(partialViewResult.Model, typeof(ExportsViewModel), "Unexpected type for model");
            ExportsViewModel partialResultModel = partialViewResult.Model as ExportsViewModel;

            Assert.IsTrue(partialResultModel.DataPreviewSections.Count > 0, "No Data Preview Sections");
            Assert.IsTrue(partialResultModel.JsonPreviews.Orgs.Count() > 0, "No Orgs for JsonPreview");
        }
Example #5
0
        private async Task <ExportsViewModel> GetDefaultExportsViewModel()
        {
            ExportsViewModel result = new ExportsViewModel();
            await ApiCalls.PopulateFilterSection1(result);

            FilterInputs filters = new FilterInputs();
            var          schools = await ApiCalls.GetSchools();

            result.SelectedSchools = string.Join(",", schools.Select(p => p.SchoolId));
            return(result);
        }
Example #6
0
        private FilterInputs GenerateTestFilterInputs(ExportsViewModel viewModel)
        {
            var inputs = new FilterInputs
            {
                Schools = viewModel.SchoolsCriteriaSection.FilterCheckboxes.Select(p => p.SchoolId).Distinct().ToList(),
                //Subjects = viewModel.SubjectsCriteriaSection.FilterCheckboxes.Select(p => p.Subject).Distinct().ToList(),
                //Courses = viewModel.CoursesCriteriaSection.FilterCheckboxes.Select(p => p.Course).Distinct().ToList(),
                Teachers = viewModel.TeachersCriteriaSection.FilterCheckboxes.Select(p => p.Teacher).Distinct().ToList()
            };

            return(inputs);
        }
        public async Task <ActionResult> Index(int?templateId = null)
        {
            var model = new ExportsViewModel();

            await InitializeModel(model);

            if (templateId != null)
            {
                await InitializeModelForEdit(model, templateId.Value);
            }

            return(View(model));
        }
        public async Task <ActionResult> DownloadCsv(ExportsViewModel model)
        {
            var schools = model.SelectedSchools?.Split(',').ToList();
            //var schoolYears = model.SelectedSchoolYears?.Split(',').ToList();
            //var terms = model.SelectedTerms?.Split(',').ToList();
            //var subjects = model.SelectedSubjects?.Split(',').ToList();
            //var courses = model.SelectedCourses?.Split(',').ToList();
            var teachers = model.SelectedTeachers?.Split(',').ToList();
            var sections = model.SelectedSections?.Split(',').ToList();

            var csvUtils = new CsvMethods();
            //var bytes = await csvUtils.GetZipFile(schools, schoolYears, terms, subjects, courses, teachers, sections, model.OneRosterVersion);
            var bytes = await csvUtils.GetZipFile(schools, teachers, sections, model.OneRosterVersion);

            var downloadFileName = "EdFiExport_" + string.Format("{0:MM_dd_yyyy}", DateTime.Now) + ".zip";

            return(File(bytes, "application/zip", downloadFileName));
        }
        private async Task InitializeModel(ExportsViewModel model)
        {
            await ApiCalls.PopulateFilterSection1(model);

            //model.SubjectsCriteriaSection = new ApiCriteriaSection
            //{
            //    SectionName = "Subjects"
            //};

            //model.CoursesCriteriaSection = new ApiCriteriaSection
            //{
            //    SectionName = "Courses"
            //};

            model.TeachersCriteriaSection = new ApiCriteriaSection
            {
                SectionName = "Teachers"
            };

            model.SectionsCriteriaSection = new ApiCriteriaSection
            {
                SectionName = "Sections"
            };

            using (var context = new ApplicationDbContext())
            {
                model.OneRosterVersion = context.ApplicationSettings.FirstOrDefault(x => x.SettingName == ApplicationSettingsTypes.DefaultOneRosterVersion)?.SettingValue;
            }

            ViewBag.OneRosterVersions = new List <SelectListItem>
            {
                new SelectListItem
                {
                    Text  = OneRosterVersions.OR_1_0,
                    Value = OneRosterVersions.OR_1_0
                },
                new SelectListItem
                {
                    Text  = OneRosterVersions.OR_1_1,
                    Value = OneRosterVersions.OR_1_1
                }
            };
        }
Example #10
0
        public async Task ExportsController_DownloadCsvTest()
        {
            AuthenticationHelper.HttpContext = AuthenticationHelper.CreateHttpContext(true);
            ExportsController controller = new ExportsController();

            SetupController(controller);

            //ExportsViewModel defaultExportViewModel = await GetDefaultExportsViewModel();
            ExportsViewModel defaultExportViewModel = new ExportsViewModel();
            var defaultResult = await controller.DownloadCsv(defaultExportViewModel);

            Assert.IsNotNull(defaultResult, "Invalid Result");
            Assert.IsInstanceOfType(defaultResult, typeof(FileContentResult), "Is not a FileResult");
            FileContentResult fileResult = defaultResult as FileContentResult;

            Assert.IsTrue(!string.IsNullOrWhiteSpace(fileResult.FileDownloadName), "Invalid File Name");
            Assert.IsTrue(fileResult.FileContents != null && fileResult.FileContents.Count() > 0, "Invalid File Contents");
            List <string> lstInvalidFileNames = new List <string>();

            using (System.IO.MemoryStream memStream = new System.IO.MemoryStream(fileResult.FileContents))
            {
                System.IO.Compression.ZipArchive zipArchive = new ZipArchive(memStream);
                string[] validFileNames =
                { "orgs.csv", "users.csv", "courses.csv", "classes.csv", "enrollments.csv", "academicSessions.csv", "demographics.csv" };
                foreach (var singleEntry in zipArchive.Entries)
                {
                    if (!validFileNames.Contains(singleEntry.Name))
                    {
                        lstInvalidFileNames.Add(singleEntry.Name);
                    }
                    //For Validation rules check https://docs.google.com/spreadsheets/d/1X-gX06CaeDwDn5-Q-pqVAVahgJRtQqFOx5jj3FtIHKs/edit#gid=0
                    ValidateFileContents(singleEntry);
                }
                memStream.Close();
            }
            if (lstInvalidFileNames.Count > 0)
            {
                Assert.Fail("Invalid File Names: " +
                            String.Join(",", lstInvalidFileNames.ToArray()));
            }
            //var zipFile = System.IO.Compression.ZipFile
        }
Example #11
0
        public async Task ExportsController_IndexTest()
        {
            AuthenticationHelper.HttpContext = AuthenticationHelper.CreateHttpContext(true);
            ExportsController controller = new ExportsController();

            SetupController(controller);
            ExportsViewModel defaultExportViewModel = await GetDefaultExportsViewModel();

            var defaultResult = await controller.Index();

            Assert.IsNotNull(defaultResult, "invalid result");
            Assert.IsInstanceOfType(defaultResult, typeof(ViewResult), "Unexpected result type");
            ViewResult defaultViewResult = defaultResult as ViewResult;

            Assert.IsNotNull(defaultViewResult.Model, "Invalid model result");
            Assert.IsInstanceOfType(defaultViewResult.Model, typeof(ExportsViewModel), "Unexpected model type");
            ExportsViewModel modelResult = defaultViewResult.Model as ExportsViewModel;

            Assert.IsTrue(modelResult.SchoolsCriteriaSection.FilterCheckboxes != null &&
                          modelResult.SchoolsCriteriaSection.FilterCheckboxes.Count > 0, "No data for Schools Criteria");
        }
Example #12
0
        public async Task ExportsController_SaveTemplate()
        {
            AuthenticationHelper.HttpContext = AuthenticationHelper.CreateHttpContext(true);
            ExportsController controller = new ExportsController();

            SetupController(controller);

            //ExportsViewModel defaultExportViewModel = await GetDefaultExportsViewModel();
            DateTime         currentTime            = DateTime.UtcNow;
            ExportsViewModel defaultExportViewModel = await GetDefaultExportsViewModel();

            defaultExportViewModel.NewTemplateName       = string.Format("[UNIT TEST TEMPLATE]-{0}", currentTime);
            defaultExportViewModel.NewTemplateVendorName = string.Format("[UNIT TEST VENDOR]-{0}", currentTime);
            var result = controller.SaveTemplate(defaultExportViewModel);

            Assert.IsNotNull(result, "Invalid result");
            if (result is RedirectToRouteResult)
            {
                RedirectToRouteResult redirecResult = result as RedirectToRouteResult;
                Assert.IsTrue(redirecResult.RouteValues["action"].ToString() == "Index" && redirecResult.RouteValues["controller"].ToString() == "Templates");
            }
            else
            {
                Assert.Fail("Unexpected result");
            }
            var templateToDelete = AuthenticationHelper.DB.Templates.Where(p => p.VendorName ==
                                                                           defaultExportViewModel.NewTemplateVendorName && p.TemplateName == defaultExportViewModel.NewTemplateName).FirstOrDefault();

            if (templateToDelete != null)
            {
                AuthenticationHelper.DB.Templates.Remove(templateToDelete);
                if (
                    AuthenticationHelper.DB.SaveChanges() == 0)
                {
                    Assert.Fail("Unable to delete template: " + defaultExportViewModel.NewTemplateName);
                }
            }
        }
        public ActionResult SaveTemplate(ExportsViewModel model)
        {
            var schoolIds = model.SelectedSchools?.Split(',').ToList();
            //var schoolYears = model.SelectedSchoolYears?.Split(',').ToList();
            //var terms = model.SelectedTerms?.Split(',').ToList();
            //var subjects = model.SelectedSubjects?.Split(',').ToList();
            //var courses = model.SelectedCourses?.Split(',').ToList();
            var teachers = model.SelectedTeachers?.Split(',').ToList();
            var sections = model.SelectedSections?.Split(',').ToList();

            var inputs = new FilterInputs
            {
                Schools = schoolIds,
                //SchoolYears = schoolYears,
                //Terms = terms,
                //Subjects = subjects,
                //Courses = courses,
                Teachers = teachers,
                Sections = sections
            };

            var inputsJson = JsonConvert.SerializeObject(inputs);

            var template = new Template
            {
                TemplateName     = model.NewTemplateName,
                VendorName       = model.NewTemplateVendorName,
                OneRosterVersion = model.OneRosterVersion,
                Filters          = inputsJson
            };

            db.Templates.Add(template);
            db.SaveChanges(UserName, IpAddress);

            return(RedirectToAction("Index", "Templates"));
        }
        public async Task <ActionResult> Preview(List <string> schoolIds,
                                                 //List<string> schoolYears,
                                                 //List<string> terms,
                                                 //List<string> subjects,
                                                 //List<string> courses,
                                                 List <string> teachers,
                                                 List <string> sections,
                                                 string oneRosterVersion)
        {
            var model  = new ExportsViewModel();
            var inputs = new FilterInputs
            {
                Schools = schoolIds,
                //SchoolYears = schoolYears,
                //Terms = terms,
                //Subjects = subjects,
                //Courses = courses,
                Teachers = teachers,
                Sections = sections
            };

            model.JsonPreviews = await ApiCalls.GetJsonPreviews(inputs, oneRosterVersion);

            IEnumerable <string> orgColumnNames;
            IEnumerable <string> usersColumnNames;
            IEnumerable <string> coursesColumnNames;
            IEnumerable <string> classesColumnNames;
            IEnumerable <string> enrollmentsColumnNames;
            IEnumerable <string> academicsessionsColumnNames;

            if (oneRosterVersion == OneRosterVersions.OR_1_0)
            {
                orgColumnNames              = typeof(CsvOrgs).GetProperties().Where(x => Attribute.IsDefined(x, typeof(OR10IncludeFieldAttribute))).Select(x => x.Name.Replace("__", "."));
                usersColumnNames            = typeof(CsvUsers).GetProperties().Where(x => Attribute.IsDefined(x, typeof(OR10IncludeFieldAttribute))).Select(x => x.Name.Replace("__", "."));
                coursesColumnNames          = typeof(CsvCourses).GetProperties().Where(x => Attribute.IsDefined(x, typeof(OR10IncludeFieldAttribute))).Select(x => x.Name.Replace("__", "."));
                classesColumnNames          = typeof(CsvClasses).GetProperties().Where(x => Attribute.IsDefined(x, typeof(OR10IncludeFieldAttribute))).Select(x => x.Name.Replace("__", "."));
                enrollmentsColumnNames      = typeof(CsvEnrollments).GetProperties().Where(x => Attribute.IsDefined(x, typeof(OR10IncludeFieldAttribute))).Select(x => x.Name.Replace("__", "."));
                academicsessionsColumnNames = typeof(CsvAcademicSessions).GetProperties().Where(x => Attribute.IsDefined(x, typeof(OR10IncludeFieldAttribute))).Select(x => x.Name.Replace("__", "."));
            }
            else
            {
                orgColumnNames              = typeof(CsvOrgs).GetProperties().Where(x => Attribute.IsDefined(x, typeof(OR11IncludeFieldAttribute))).Select(x => x.Name.Replace("__", "."));
                usersColumnNames            = typeof(CsvUsers).GetProperties().Where(x => Attribute.IsDefined(x, typeof(OR11IncludeFieldAttribute))).Select(x => x.Name.Replace("__", "."));
                coursesColumnNames          = typeof(CsvCourses).GetProperties().Where(x => Attribute.IsDefined(x, typeof(OR11IncludeFieldAttribute))).Select(x => x.Name.Replace("__", "."));
                classesColumnNames          = typeof(CsvClasses).GetProperties().Where(x => Attribute.IsDefined(x, typeof(OR11IncludeFieldAttribute))).Select(x => x.Name.Replace("__", "."));
                enrollmentsColumnNames      = typeof(CsvEnrollments).GetProperties().Where(x => Attribute.IsDefined(x, typeof(OR11IncludeFieldAttribute))).Select(x => x.Name.Replace("__", "."));
                academicsessionsColumnNames = typeof(CsvAcademicSessions).GetProperties().Where(x => Attribute.IsDefined(x, typeof(OR11IncludeFieldAttribute))).Select(x => x.Name.Replace("__", "."));
            }

            model.DataPreviewSections = new List <DataPreviewSection>
            {
                new DataPreviewSection
                {
                    SectionName = "orgs",
                    ColumnNames = orgColumnNames,
                    CurrentPage = 1,
                    TotalPages  = model.JsonPreviews.OrgsTotalPages
                },
                new DataPreviewSection
                {
                    SectionName = "users",
                    ColumnNames = usersColumnNames,
                    CurrentPage = 1,
                    TotalPages  = model.JsonPreviews.UsersTotalPages
                },
                new DataPreviewSection
                {
                    SectionName = "courses",
                    ColumnNames = coursesColumnNames,
                    CurrentPage = 1,
                    TotalPages  = model.JsonPreviews.CoursesTotalPages
                },
                new DataPreviewSection
                {
                    SectionName = "classes",
                    ColumnNames = classesColumnNames,
                    CurrentPage = 1,
                    TotalPages  = model.JsonPreviews.ClassesTotalPages
                },
                new DataPreviewSection
                {
                    SectionName = "enrollments",
                    ColumnNames = enrollmentsColumnNames,
                    CurrentPage = 1,
                    TotalPages  = model.JsonPreviews.EnrollmentsTotalPages
                },
                new DataPreviewSection
                {
                    SectionName = "academicsessions",
                    ColumnNames = academicsessionsColumnNames,
                    CurrentPage = 1,
                    TotalPages  = model.JsonPreviews.AcademicSessionsTotalPages
                }
            };

            if (oneRosterVersion == OneRosterVersions.OR_1_1)
            {
                var manifestColumnNames = typeof(CsvManifest).GetProperties().Where(x => Attribute.IsDefined(x, typeof(OR11IncludeFieldAttribute))).Select(x => x.Name.Replace("__", "."));
                model.DataPreviewSections.Add(new DataPreviewSection
                {
                    SectionName = "manifest",
                    ColumnNames = manifestColumnNames
                });
            }

            return(PartialView("_DataPreview", model));
        }
        private async Task InitializeModelForEdit(ExportsViewModel model, int templateId)
        {
            var template = db.Templates.First(x => x.TemplateId == templateId);

            model.EditTemplateId   = templateId;
            model.EditTemplateName = template.TemplateName;
            model.OneRosterVersion = template.OneRosterVersion;

            var filters = JsonConvert.DeserializeObject <FilterInputs>(template.Filters);

            CheckSelectedBoxes(model.SchoolsCriteriaSection.FilterCheckboxes, filters.Schools);
            model.SchoolsCriteriaSection.IsExpanded = filters.Schools != null;

            if (filters.Teachers != null)
            {
                var teachersSection = await ApiCalls.GetTeachers(filters.Schools, false);

                var alreadyCheckedTeachers = await ApiCalls.GetSpecificTeachers(filters.Teachers);

                var duplicateTeachers = teachersSection.AllCheckboxes.Where(x => filters.Teachers.Contains(x.Id)).ToList();
                foreach (var box in duplicateTeachers)
                {
                    teachersSection.AllCheckboxes.Remove(box);
                }
                var duplicateTeachers2 = teachersSection.FilterCheckboxes.Where(x => filters.Teachers.Contains(x.Id)).ToList();
                foreach (var box in duplicateTeachers2)
                {
                    teachersSection.FilterCheckboxes.Remove(box);
                }
                teachersSection.AllCheckboxes.AddRange(alreadyCheckedTeachers);
                teachersSection.FilterCheckboxes.AddRange(alreadyCheckedTeachers);
                teachersSection.AllCheckboxes    = teachersSection.AllCheckboxes.OrderByDescending(x => x.Selected).ToList();
                teachersSection.FilterCheckboxes = teachersSection.FilterCheckboxes.OrderByDescending(x => x.Selected).ToList();
                teachersSection.IsExpanded       = alreadyCheckedTeachers != null && alreadyCheckedTeachers.Count() > 0;
                model.TeachersCriteriaSection    = teachersSection;
            }

            if (filters.Schools != null)
            {
                var sectionsSection = await ApiCalls.GetSections(filters.Schools, false);

                if (filters.Sections != null)
                {
                    var alreadyCheckedSections = await ApiCalls.GetSpecificSections(filters.Sections);

                    var duplicateSections = sectionsSection.AllCheckboxes.Where(x => filters.Sections.Contains(x.Id)).ToList();
                    foreach (var box in duplicateSections)
                    {
                        sectionsSection.AllCheckboxes.Remove(box);
                    }
                    var duplicateSections2 = sectionsSection.FilterCheckboxes.Where(x => filters.Sections.Contains(x.Id)).ToList();
                    foreach (var box in duplicateSections2)
                    {
                        sectionsSection.FilterCheckboxes.Remove(box);
                    }
                    sectionsSection.AllCheckboxes.AddRange(alreadyCheckedSections);
                    sectionsSection.FilterCheckboxes.AddRange(alreadyCheckedSections);
                    sectionsSection.AllCheckboxes    = sectionsSection.AllCheckboxes.OrderByDescending(x => x.Selected).ToList();
                    sectionsSection.FilterCheckboxes = sectionsSection.FilterCheckboxes.OrderByDescending(x => x.Selected).ToList();
                    sectionsSection.IsExpanded       = alreadyCheckedSections != null && alreadyCheckedSections.Count() > 0;
                    model.SectionsCriteriaSection    = sectionsSection;
                }
            }
        }