diff --git a/.gitignore b/.gitignore index f94672614..9b9ae3d53 100644 --- a/.gitignore +++ b/.gitignore @@ -3,7 +3,6 @@ ## From Github /~https://github.com/github/gitignore/blob/master/VisualStudio.gitignore # Avoid database files -*.edmx */Metadata.cs */ModelPartialClasses.cs @@ -271,6 +270,7 @@ paket-files/ ## Secret Files secrets.config test_credentials.py +credentials.py ## Python diff --git a/.travis.yml b/.travis.yml index 0825d49a6..a89243bb3 100644 --- a/.travis.yml +++ b/.travis.yml @@ -8,7 +8,7 @@ os: windows mono: none # Install NuGet, then build the solution -script: +script: - choco install nuget.commandline - choco install visualstudio2017-workload-manageddesktop - choco install visualstudio2017-workload-netweb @@ -34,4 +34,4 @@ deploy: # Only send notification emails on build failure notifications: email: - on_success: never \ No newline at end of file + on_success: never diff --git a/Gordon360/ApiControllers/JobsController.cs b/Gordon360/ApiControllers/JobsController.cs index db8b48210..4948ccbe7 100644 --- a/Gordon360/ApiControllers/JobsController.cs +++ b/Gordon360/ApiControllers/JobsController.cs @@ -14,6 +14,7 @@ using Newtonsoft.Json.Linq; using Gordon360.AuthorizationFilters; using Gordon360.Static.Names; +using Gordon360.Exceptions.CustomExceptions; namespace Gordon360.ApiControllers { @@ -76,7 +77,7 @@ public IHttpActionResult getJobsForUser([FromBody] ActiveJobSelectionParametersM public HttpResponseMessage getSavedShiftsForUser() { int userID = GetCurrentUserID(); - + IEnumerable result = null; try @@ -139,6 +140,8 @@ public HttpResponseMessage editShiftForUser([FromBody] ShiftViewModel shiftDetai int userID = -1; var authenticatedUser = this.ActionContext.RequestContext.Principal as ClaimsPrincipal; var username = authenticatedUser.Claims.FirstOrDefault(x => x.Type == "user_name").Value; + var id = _accountService.GetAccountByUsername(username).GordonID; + userID = Convert.ToInt32(id); try { @@ -230,5 +233,288 @@ public IHttpActionResult getSupervisorName(int supervisorID) } return Ok(result); } + + /// + /// sends the current clock in status to the back end + /// true if user is clocked in and false if clocked out + /// + /// detail to be saved in the back end, true if user just clocked in + /// returns confirmation that the answer was recorded + [HttpPost] + [Route("clockIn")] + public IHttpActionResult ClockIn([FromBody] bool state) + { + + if (!ModelState.IsValid || state == null) + { + string errors = ""; + foreach (var modelstate in ModelState.Values) + { + foreach (var error in modelstate.Errors) + { + errors += "|" + error.ErrorMessage + "|" + error.Exception; + } + + } + throw new BadInputException() { ExceptionMessage = errors }; + } + + var authenticatedUser = this.ActionContext.RequestContext.Principal as ClaimsPrincipal; + var username = authenticatedUser.Claims.FirstOrDefault(x => x.Type == "user_name").Value; + + var id = _accountService.GetAccountByUsername(username).GordonID; + + var result = _jobsService.ClockIn(state, id); + + if (result == null) + { + return NotFound(); + } + + + return Created("Recorded answer :", result); + + } + + /// + /// gets the the clock in status from the back end + /// true if user is clocked in and false if clocked out + /// + /// ClockInViewModel + [HttpGet] + [Route("clockOut")] + public IHttpActionResult ClockOut() + { + var authenticatedUser = this.ActionContext.RequestContext.Principal as ClaimsPrincipal; + var username = authenticatedUser.Claims.FirstOrDefault(x => x.Type == "user_name").Value; + + var id = _accountService.GetAccountByUsername(username).GordonID; + + var result = _jobsService.ClockOut(id); + + if (result == null) + { + return NotFound(); + } + + return Ok(result); + } + + /// + /// deletes the last clocked in status of a user + /// + /// returns confirmation that clock in status was deleted + [HttpPut] + [Route("deleteClockIn")] + public IHttpActionResult DeleteClockIn() + { + var authenticatedUser = this.ActionContext.RequestContext.Principal as ClaimsPrincipal; + var username = authenticatedUser.Claims.FirstOrDefault(x => x.Type == "user_name").Value; + + var id = _accountService.GetAccountByUsername(username).GordonID; + + var result = _jobsService.DeleteClockIn(id); + + if (result == null) + { + return NotFound(); + } + + return Ok(result); + } + + //staff routes + + + /// + /// Get a user's active jobs + /// + /// deatils of the current Staff + /// The Staff's active jobs + [HttpPost] + [Route("getJobsStaff")] + public IHttpActionResult getJobsForStaff([FromBody] ActiveJobSelectionParametersModel details) + { + IEnumerable result = null; + int userID = GetCurrentUserID(); + try + { + result = _jobsService.getActiveJobsStaff(details.SHIFT_START_DATETIME, details.SHIFT_END_DATETIME, userID); + } + catch (Exception e) + { + System.Diagnostics.Debug.WriteLine(e.Message); + return InternalServerError(); + } + return Ok(result); + } + + /// + /// Get a user's saved shifts + /// + /// The staff's saved shifts + [HttpGet] + [Route("getSavedShiftsStaff")] + public HttpResponseMessage getSavedShiftsForStaff() + { + int userID = GetCurrentUserID(); + + IEnumerable result = null; + + try + { + result = _jobsService.getSavedShiftsForStaff(userID); + } + catch (Exception e) + { + System.Diagnostics.Debug.WriteLine(e.Message); + return Request.CreateResponse(HttpStatusCode.InternalServerError, e); + } + return Request.CreateResponse(HttpStatusCode.OK, result); + } + + /// + /// Get a user's active jobs + /// + /// The details that will be changed + /// The result of saving a shift for a staff + [HttpPost] + [Route("saveShiftStaff")] + [StateYourBusiness(operation = Operation.ADD, resource = Resource.SHIFT)] + public HttpResponseMessage saveShiftForStaff([FromBody] ShiftViewModel shiftDetails) + { + IEnumerable result = null; + IEnumerable overlapCheckResult = null; + + int userID = GetCurrentUserID(); + var authenticatedUser = this.ActionContext.RequestContext.Principal as ClaimsPrincipal; + var username = authenticatedUser.Claims.FirstOrDefault(x => x.Type == "user_name").Value; + + try + { + overlapCheckResult = _jobsService.checkForOverlappingShiftStaff(userID, shiftDetails.SHIFT_START_DATETIME, shiftDetails.SHIFT_END_DATETIME); + if (overlapCheckResult.Count() > 0) + { + return Request.CreateResponse(HttpStatusCode.Conflict, "Error: shift overlap detected"); + } + result = _jobsService.saveShiftForStaff(userID, shiftDetails.EML, shiftDetails.SHIFT_START_DATETIME, shiftDetails.SHIFT_END_DATETIME, shiftDetails.HOURS_WORKED, shiftDetails.SHIFT_NOTES, username); + } + catch (Exception e) + { + System.Diagnostics.Debug.WriteLine(e.Message); + return Request.CreateResponse(HttpStatusCode.InternalServerError, e); + } + return Request.CreateResponse(HttpStatusCode.OK, result); + } + + /// + /// Edit a shift for staff + /// The details that will be changed + /// + [HttpPut] + [Route("editShiftStaff")] + public HttpResponseMessage editShiftForStaff([FromBody] ShiftViewModel shiftDetails) + { + IEnumerable result = null; + IEnumerable overlapCheckResult = null; + + int userID = -1; + var authenticatedUser = this.ActionContext.RequestContext.Principal as ClaimsPrincipal; + var username = authenticatedUser.Claims.FirstOrDefault(x => x.Type == "user_name").Value; + var id = _accountService.GetAccountByUsername(username).GordonID; + userID = Convert.ToInt32(id); + + try + { + overlapCheckResult = _jobsService.editShiftOverlapCheck(userID, shiftDetails.SHIFT_START_DATETIME, shiftDetails.SHIFT_END_DATETIME, shiftDetails.ID); + if (overlapCheckResult.Count() > 0) + { + return Request.CreateResponse(HttpStatusCode.Conflict, "Error: shift overlap detected"); + } + result = _jobsService.editShiftStaff(shiftDetails.ID, shiftDetails.SHIFT_START_DATETIME, shiftDetails.SHIFT_END_DATETIME, shiftDetails.HOURS_WORKED, username); + } + catch (Exception e) + { + System.Diagnostics.Debug.WriteLine(e.Message); + return Request.CreateResponse(HttpStatusCode.InternalServerError, e); + } + return Request.CreateResponse(HttpStatusCode.OK, result); + } + + /// + /// Get a user's active jobs + /// + /// The result of deleting the shift for a Staff + [HttpDelete] + [Route("deleteShiftStaff/{rowID}")] + [StateYourBusiness(operation = Operation.DELETE, resource = Resource.SHIFT)] + public IHttpActionResult deleteShiftForStaff(int rowID) + { + IEnumerable result = null; + int userID = GetCurrentUserID(); + + try + { + result = _jobsService.deleteShiftForStaff(rowID, userID); + } + catch (Exception e) + { + System.Diagnostics.Debug.WriteLine(e.Message); + return InternalServerError(); + } + return Ok(result); + } + + /// + /// Submit shift for staff + /// + /// The result of submitting the shifts for staff + [HttpPost] + [Route("submitShiftsStaff")] + [StateYourBusiness(operation = Operation.UPDATE, resource = Resource.SHIFT)] + public IHttpActionResult submitShiftsForStaff([FromBody] IEnumerable shifts) + { + IEnumerable result = null; + int userID = GetCurrentUserID(); + + try + { + foreach (ShiftToSubmitViewModel shift in shifts) + { + result = _jobsService.submitShiftForStaff(userID, shift.EML, shift.SHIFT_END_DATETIME, shift.SUBMITTED_TO, shift.LAST_CHANGED_BY); + } + } + catch (Exception e) + { + System.Diagnostics.Debug.WriteLine(e.Message); + return InternalServerError(); + } + return Ok(result); + } + + /// + /// Gets the name of a supervisor based on their ID number for Staff + /// + /// The name of the supervisor + [HttpGet] + [Route("supervisorNameStaff/{supervisorID}")] + [StateYourBusiness(operation = Operation.UPDATE, resource = Resource.SHIFT)] + public IHttpActionResult getSupervisorNameStaff(int supervisorID) + { + IEnumerable result = null; + + try + { + result = _jobsService.getStaffSupervisorNameForJob(supervisorID); + } + catch (Exception e) + { + System.Diagnostics.Debug.WriteLine(e.Message); + return InternalServerError(); + } + return Ok(result); + } + } + } diff --git a/Gordon360/ApiControllers/MembershipRequestController.cs b/Gordon360/ApiControllers/MembershipRequestController.cs index 24fbb8544..5da58ff92 100644 --- a/Gordon360/ApiControllers/MembershipRequestController.cs +++ b/Gordon360/ApiControllers/MembershipRequestController.cs @@ -259,8 +259,8 @@ public IHttpActionResult ApproveRequest(int id) /// /// Sets the membership request to Denied /// - /// The id of the membership reuqest in question. - /// If successful: THe updated membership request wrapped in an OK Http status code. + /// The id of the membership request in question. + /// If successful: The updated membership request wrapped in an OK Http status code. [HttpPost] [Route("{id}/deny")] [StateYourBusiness(operation = Operation.DENY_ALLOW, resource = Resource.MEMBERSHIP_REQUEST)] @@ -290,7 +290,7 @@ public IHttpActionResult DenyRequest(int id) return Ok(result); } /// - /// Delets a membership request + /// Deletes a membership request /// /// The id of the membership request to delete /// The deleted object diff --git a/Gordon360/ApiControllers/NewsController.cs b/Gordon360/ApiControllers/NewsController.cs new file mode 100644 index 000000000..46ae91e5a --- /dev/null +++ b/Gordon360/ApiControllers/NewsController.cs @@ -0,0 +1,213 @@ +using Gordon360.Exceptions.CustomExceptions; +using Gordon360.Repositories; +using Gordon360.Services; +using Gordon360.Models; +using System.Linq; +using System.Web.Http; +using System.Security.Claims; +using Gordon360.Exceptions.ExceptionFilters; +using Gordon360.AuthorizationFilters; +using Gordon360.Static.Names; +using Gordon360.Models.ViewModels; + +namespace Gordon360.Controllers.Api +{ + [RoutePrefix("api/news")] + [Authorize] + [CustomExceptionFilter] + public class NewsController : ApiController + { + private INewsService _newsService; + private IAccountService _accountService; + + /**private void catchBadInput() + { + if (!ModelState.IsValid || string.IsNullOrWhiteSpace(variable)) + { + string errors = ""; + foreach (var modelstate in ModelState.Values) + { + foreach (var error in modelstate.Errors) + { + errors += "|" + error.ErrorMessage + "|" + error.Exception; + } + + } + throw new BadInputException() { ExceptionMessage = errors }; + } + }*/ + + // Constructor + public NewsController() + { + // Connect to service through which data (from the database) can be accessed + IUnitOfWork _unitOfWork = new UnitOfWork(); + _newsService = new NewsService(_unitOfWork); + _accountService = new AccountService(_unitOfWork); + } + + public NewsController(INewsService newsService) + { + _newsService = newsService; + } + + /// Gets a news item by id from the database + /// The id of the news item to retrieve + /// The news item + [HttpGet] + [Route("{newsID}")] + [StateYourBusiness(operation = Operation.READ_ONE, resource = Resource.NEWS)] + // Private route to authenticated users + public IHttpActionResult GetByID(int newsID) + { + // StateYourBusiness verifies that user is authenticated + var result = (StudentNewsViewModel)_newsService.Get(newsID); + if (result == null) + { + return NotFound(); + } + return Ok(result); + } + + /** Call the service that gets all approved student news entries not yet expired, filtering + * out the expired by comparing 2 weeks past date entered to current date + */ + [HttpGet] + [Route("not-expired")] + public IHttpActionResult GetNotExpired() + { + var result = _newsService.GetNewsNotExpired(); + if (result == null) + { + return NotFound(); + } + return Ok(result); + } + + /** Call the service that gets all new and approved student news entries + * which have not already expired, + * checking novelty by comparing an entry's date entered to 10am on the previous day + */ + [HttpGet] + [Route("new")] + public IHttpActionResult GetNew() + { + var result = _newsService.GetNewsNew(); + if (result == null) + { + return NotFound(); + } + return Ok(result); + } + + /** Call the service that gets the list of categories + */ + [HttpGet] + [Route("categories")] + public IHttpActionResult GetCategories() + { + var result = _newsService.GetNewsCategories(); + if (result == null) + { + return NotFound(); + } + return Ok(result); + } + + /** Call the service that gets all unapproved student news entries (by a particular user) + * not yet expired, filtering out the expired news + */ + [HttpGet] + [Route("personal-unapproved")] + public IHttpActionResult GetNewsPersonalUnapproved() + { + // Get authenticated username/id + var authenticatedUser = this.ActionContext.RequestContext.Principal as ClaimsPrincipal; + var username = authenticatedUser.Claims.FirstOrDefault(x => x.Type == "user_name").Value; + var id = _accountService.GetAccountByUsername(username).GordonID; + + // Call appropriate service + var result = _newsService.GetNewsPersonalUnapproved(id, username); + if (result == null) + { + return NotFound(); + } + return Ok(result); + } + + /** Create a new news item to be added to the database + */ + [HttpPost] + [Route("")] + public IHttpActionResult Post([FromBody] StudentNews newsItem) + { + // Check for bad input + if (!ModelState.IsValid || newsItem == null ) + { + string errors = ""; + foreach (var modelstate in ModelState.Values) + { + foreach (var error in modelstate.Errors) + { + errors += "|" + error.ErrorMessage + "|" + error.Exception; + } + } + throw new BadInputException() { ExceptionMessage = errors }; + } + + // Get authenticated username/id + var authenticatedUser = this.ActionContext.RequestContext.Principal as ClaimsPrincipal; + var username = authenticatedUser.Claims.FirstOrDefault(x => x.Type == "user_name").Value; + var id = _accountService.GetAccountByUsername(username).GordonID; + + // Call appropriate service + var result = _newsService.SubmitNews(newsItem, username, id); + if (result == null) + { + return NotFound(); + } + return Created("News", result); + } + + /// Deletes a news item from the database + /// The id of the news item to delete + /// The deleted news item + /// The news item must be authored by the user and must not be expired + [HttpDelete] + [Route("{newsID}")] + [StateYourBusiness(operation = Operation.DELETE, resource = Resource.NEWS)] + // Private route to authenticated authors of the news entity + public IHttpActionResult Delete(int newsID) + { + // StateYourBusiness verifies that user is authenticated + // Delete permission should be allowed only to authors of the news item + // News item must not have already expired + var result = _newsService.DeleteNews(newsID); + // Shouldn't be necessary + if(result == null) + { + return NotFound(); + } + return Ok(result); + } + + /// + /// (Controller) Edits a news item in the database + /// + /// The id of the news item to edit + /// The news object that contains updated values + /// The updated news item + /// The news item must be authored by the user and must not be expired and must be unapproved + [HttpPut] + [Route("{newsID}")] + [StateYourBusiness(operation = Operation.UPDATE, resource = Resource.NEWS)] + // Private route to authenticated users - authors of posting or admins + public IHttpActionResult EditPosting(int newsID,[FromBody] StudentNews newData) + { + // StateYourBusiness verifies that user is authenticated + var result = _newsService.EditPosting(newsID, newData); + return Ok(result); + } + + } +} diff --git a/Gordon360/ApiControllers/SaveController.cs b/Gordon360/ApiControllers/SaveController.cs index d6db1ef89..7dc280b3e 100644 --- a/Gordon360/ApiControllers/SaveController.cs +++ b/Gordon360/ApiControllers/SaveController.cs @@ -45,7 +45,11 @@ public SaveController(ISaveService saveService) public IHttpActionResult GetUpcomingRides() { - var result = _saveService.GetUpcoming(); + var authenticatedUser = this.ActionContext.RequestContext.Principal as ClaimsPrincipal; + var username = authenticatedUser.Claims.FirstOrDefault(x => x.Type == "user_name").Value; + var id = _accountService.GetAccountByUsername(username).GordonID; + + var result = _saveService.GetUpcoming(id); if (result == null) { return NotFound(); @@ -96,6 +100,27 @@ public IHttpActionResult PostRide([FromBody] Save_Rides newRide) } + /// Cancel an existing ride item + /// The identifier for the ride to be cancel + /// Calls the server to make a call and remove the given ride from the database + [HttpPut] + [Route("rides/cancel/{rideID}")] + public IHttpActionResult CancelRide(string rideID) + { + var authenticatedUser = this.ActionContext.RequestContext.Principal as ClaimsPrincipal; + var username = authenticatedUser.Claims.FirstOrDefault(x => x.Type == "user_name").Value; + var id = _accountService.GetAccountByUsername(username).GordonID; + + var result = _saveService.CancelRide(rideID, id); + + if (result != 0) + { + return NotFound(); + } + + return Ok(result); + } + /// Delete an existing ride item /// The identifier for the ride to be deleted /// Calls the server to make a call and remove the given ride from the database @@ -270,4 +295,4 @@ public IHttpActionResult DeleteBooking(string rideID) // return Created("myride", myRide); //} } -} \ No newline at end of file +} diff --git a/Gordon360/ApiControllers/WellnessController.cs b/Gordon360/ApiControllers/WellnessController.cs new file mode 100644 index 000000000..ba0e5e751 --- /dev/null +++ b/Gordon360/ApiControllers/WellnessController.cs @@ -0,0 +1,123 @@ +using System.Linq; +using System.Security.Claims; +using System.Web.Http; +using System.Net; +using System.Net.Http; +using Gordon360.Exceptions.ExceptionFilters; +using Gordon360.Repositories; +using Gordon360.Services; +using Gordon360.Models; +using Gordon360.Exceptions.CustomExceptions; + +namespace Gordon360.Controllers.Api +{ + [RoutePrefix("api/wellness")] + [CustomExceptionFilter] + [Authorize] + public class WellnessController : ApiController + { + private IProfileService _profileService; + private IAccountService _accountService; + private IRoleCheckingService _roleCheckingService; + + private IWellnessService _wellnessService; + + public WellnessController() + { + var _unitOfWork = new UnitOfWork(); + _wellnessService = new WellnessService(); + _profileService = new ProfileService(_unitOfWork); + _accountService = new AccountService(_unitOfWork); + _roleCheckingService = new RoleCheckingService(_unitOfWork); + } + + public WellnessController(IWellnessService wellnessService) + { + _wellnessService = wellnessService; + } + + /// + /// Gets current wellness status of student + /// + /// Json WellnessViewModel + [HttpGet] + [Route("")] + public IHttpActionResult Get() + { + var authenticatedUser = this.ActionContext.RequestContext.Principal as ClaimsPrincipal; + var username = authenticatedUser.Claims.FirstOrDefault(x => x.Type == "user_name").Value; + + var id = _accountService.GetAccountByUsername(username).GordonID; + + var result = _wellnessService.GetStatus(id); + + if (result == null) + { + return NotFound(); + } + + return Ok(result); + } + + /// + /// Gets question for wellness check from the back end + /// + /// json WellnessQuestionViewModel + [HttpGet] + [Route("question")] + public IHttpActionResult GetQuestion() + { + var result = _wellnessService.GetQuestion(); + + if (result == null) + { + return NotFound(); + } + + return Ok(result); + } + + + /// + /// Stores the user's wellness check answer, with a timestamp. + /// If answer boolean is true: student is feeling symptomatic(feeling sick). + /// If answer boolean is false: student is not feeling symptomatic(feeling fine). + /// + /// Ok if message was recorded + [HttpPost] + [Route("")] + public IHttpActionResult PostAnswer([FromBody] bool answer) + { + + if (!ModelState.IsValid || answer == null) + { + string errors = ""; + foreach (var modelstate in ModelState.Values) + { + foreach (var error in modelstate.Errors) + { + errors += "|" + error.ErrorMessage + "|" + error.Exception; + } + + } + throw new BadInputException() { ExceptionMessage = errors }; + } + + var authenticatedUser = this.ActionContext.RequestContext.Principal as ClaimsPrincipal; + var username = authenticatedUser.Claims.FirstOrDefault(x => x.Type == "user_name").Value; + + var id = _accountService.GetAccountByUsername(username).GordonID; + + var result = _wellnessService.PostStatus(answer, id); + + if (result == null) + { + return NotFound(); + } + + + return Created("Recorded answer :", result); + + } + } +} \ No newline at end of file diff --git a/Gordon360/AuthorizationFilters/StateYourBusiness.cs b/Gordon360/AuthorizationFilters/StateYourBusiness.cs index d276e246b..3b594839a 100644 --- a/Gordon360/AuthorizationFilters/StateYourBusiness.cs +++ b/Gordon360/AuthorizationFilters/StateYourBusiness.cs @@ -12,13 +12,13 @@ namespace Gordon360.AuthorizationFilters { /* Authorization Filter. * It is actually an action filter masquerading as an authorization filter. This is because I need access to the - * parameters passed to the controller. Authorizatoin Filters don't have that access. Action Filters do. + * parameters passed to the controller. Authorization Filters don't have that access. Action Filters do. * * Because of the nature of how we authorize people, this code might seem very odd, so I'll try to explain. * Proceed at your own risk. If you can understand this code, you can understand the whole project. * * 1st Observation: You can't authorize access to a resource that isn't owned by someone. Resources like Sessions, Participations, - * and Activity Definitions are accessbile by anyone. + * and Activity Definitions are accessibile by anyone. * 2nd Observation: To Authorize someone to perform an action on a resource, you need to know the following: * 1. Who is to be authorized? 2.What resource are they trying to access? 3. What operation are they trying to make on the resource? * This "algorithm" uses those three points and decides through a series of switch statements if the current user @@ -51,6 +51,11 @@ public override void OnActionExecuting(HttpActionContext actionContext) user_position = authenticatedUser.Claims.FirstOrDefault(x => x.Type == "college_role").Value; user_id = authenticatedUser.Claims.FirstOrDefault(x => x.Type == "id").Value; user_name = authenticatedUser.Claims.FirstOrDefault(x => x.Type == "user_name").Value; + + // Keeping these for now commented out as more permissions testing needs to be done in future + //System.Diagnostics.Debug.WriteLine("User name: " + user_name); + //System.Diagnostics.Debug.WriteLine("User Position: " + user_position); + if (user_position == Position.SUPERADMIN) { var adminService = new AdministratorService(new UnitOfWork()); @@ -65,12 +70,11 @@ public override void OnActionExecuting(HttpActionContext actionContext) } } - // Can the user perfom the operation on the resource? + // Can the user perform the operation on the resource? isAuthorized = canPerformOperation(resource, operation); - if(!isAuthorized) + if (!isAuthorized) { actionContext.Response = new HttpResponseMessage(System.Net.HttpStatusCode.Unauthorized); - } base.OnActionExecuting(actionContext); @@ -174,6 +178,8 @@ private bool canReadOne(string resource) { return true; } + case Resource.NEWS: + return true; default: return false; } @@ -271,6 +277,10 @@ private bool canReadPartial(string resource) { return true; } + case Resource.NEWS: + { + return true; + } default: return false; } } @@ -326,6 +336,8 @@ private bool canReadAll(string resource) return false; case Resource.ADMIN: return false; + case Resource.NEWS: + return true; default: return false; } } @@ -336,6 +348,8 @@ private bool canReadPublic(string resource) { case Resource.SLIDER: return true; + case Resource.NEWS: + return false; default: return false; } @@ -396,6 +410,8 @@ private bool canAdd(string resource) return false; case Resource.ERROR_LOG: return true; + case Resource.NEWS: + return true; default: return false; } } @@ -540,6 +556,22 @@ private bool canUpdate(string resource) return false; } + case Resource.NEWS: + var newsID = context.ActionArguments["newsID"]; + var newsService = new NewsService(new UnitOfWork()); + var newsItem = newsService.Get((int)newsID); + // only unapproved posts may be updated + var approved = newsItem.Accepted; + if (approved == null || approved == true) + return false; + // can update if user is admin + if (user_position == Position.SUPERADMIN) + return true; + // can update if user is news item author + string newsAuthor = newsItem.ADUN; + if (user_name == newsAuthor) + return true; + return false; default: return false; } } @@ -558,17 +590,17 @@ private bool canDelete(string resource) return true; var membershipService = new MembershipService(new UnitOfWork()); var membershipID = (int)context.ActionArguments["id"]; - var membershipToConsider = membershipService.GetMembershipsForStudent(user_name); - var is_membershipOwner = ((MEMBERSHIP)membershipToConsider).ID_NUM.ToString() == user_id; + var membershipToConsider = membershipService.GetSpecificMembership(membershipID); + var is_membershipOwner = membershipToConsider.ID_NUM.ToString() == user_id; if (is_membershipOwner) return true; - var activityCode = ((MEMBERSHIP)membershipToConsider).ACT_CDE; + var activityCode = membershipToConsider.ACT_CDE; var isGroupAdmin = membershipService.GetGroupAdminMembershipsForActivity(activityCode).Where(x => x.IDNumber.ToString() == user_id).Count() > 0; if (isGroupAdmin) return true; - + return false; } case Resource.MEMBERSHIP_REQUEST: @@ -600,6 +632,28 @@ private bool canDelete(string resource) return false; case Resource.ADMIN: return false; + case Resource.NEWS: + { + var newsID = context.ActionArguments["newsID"]; + var newsService = new NewsService(new UnitOfWork()); + var newsItem = newsService.Get((int)newsID); + // only expired news items may be deleted + var todaysDate = System.DateTime.Now; + var newsDate = (System.DateTime)newsItem.Entered; + var dateDiff = (todaysDate - newsDate).Days; + if (newsDate == null || dateDiff >= 14) + { + return false; + } + // user is admin + if (user_position == Position.SUPERADMIN) + return true; + // user is news item author + string newsAuthor = newsItem.ADUN; + if (user_name == newsAuthor) + return true; + return false; + } default: return false; } } diff --git a/Gordon360/Documentation/Gordon360.xml b/Gordon360/Documentation/Gordon360.xml index 3e051f4a8..5cc86f2ab 100644 --- a/Gordon360/Documentation/Gordon360.xml +++ b/Gordon360/Documentation/Gordon360.xml @@ -8,27 +8,27 @@ Return a list of accounts matching some or all of the search parameter - - + + Full Explanation: - + Returns a list of accounts ordered by key of a combination of users first/last/user name in the following order 1.first or last name begins with search query, 2.first or last name in Username that begins with search query 3.first or last name that contains the search query - + If Full Names of any two accounts are the same the follow happens to the dictionary key to solve this problem 1. If there is a number attached to their account this is appened to the end of their key 2. Otherwise an '1' is appended to the end - + Note: A '1' is added inbetween a key's first and last name or first and last username in order to preserve the presedence set by shorter names as both first and last are used as a part of the key in order to order matching first/last names with the remaining part of their name but this resulted in the presedence set by shorter names to be lost - + Note: "z" s are added in order to keep each case split into each own group in the dictionary - + The input to search for All accounts meeting some or all of the parameter @@ -56,15 +56,15 @@ - - + + All accounts meeting some or all of the parameter This function generates a key for each account - + This is what you would want to sort by first, used for first part of key This is what you want to sort by second, used for second part of key Set where in the dictionary this key group will be ordered @@ -213,6 +213,71 @@ The name of the supervisor + + + sends the current clock in status to the back end + true if user is clocked in and false if clocked out + + detail to be saved in the back end, true if user just clocked in + returns confirmation that the answer was recorded + + + + gets the the clock in status from the back end + true if user is clocked in and false if clocked out + + ClockInViewModel + + + + deletes the last clocked in status of a user + + returns confirmation that clock in status was deleted + + + + Get a user's active jobs + + + The Staff's active jobs + + + + Get a user's saved shifts + + The staff's saved shifts + + + + Get a user's active jobs + + + The result of saving a shift for a staff + + + + Edit a shift for staff + The details that will be changed + + + + + Get a user's active jobs + + The result of deleting the shift for a Staff + + + + Submit shift for staff + + The result of submitting the shifts for staff + + + + Gets the name of a supervisor based on their ID number for Staff + + The name of the supervisor + Gets all upcoming ride objects @@ -231,6 +296,11 @@ Successfully posted ride object + + Cancel an existing ride item + The identifier for the ride to be cancel + Calls the server to make a call and remove the given ride from the database + Delete an existing ride item The identifier for the ride to be deleted @@ -247,6 +317,63 @@ The identifier for the booking to be deleted Calls the server to make a call and remove the given booking from the database + + private void catchBadInput() + { + if (!ModelState.IsValid || string.IsNullOrWhiteSpace(variable)) + { + string errors = ""; + foreach (var modelstate in ModelState.Values) + { + foreach (var error in modelstate.Errors) + { + errors += "|" + error.ErrorMessage + "|" + error.Exception; + } + + } + throw new BadInputException() { ExceptionMessage = errors }; + } + } + + + Gets a news item by id from the database + The id of the news item to retrieve + The news item + + + Call the service that gets all approved student news entries not yet expired, filtering + out the expired by comparing 2 weeks past date entered to current date + + + Call the service that gets all new and approved student news entries + which have not already expired, + checking novelty by comparing an entry's date entered to 10am on the previous day + + + Call the service that gets the list of categories + + + Call the service that gets all unapproved student news entries (by a particular user) + not yet expired, filtering out the expired news + + + Create a new news item to be added to the database + + + Deletes a news item from the database + The id of the news item to delete + The deleted news item + The news item must be authored by the user and must not be expired + + + + (Controller) Edits a news item in the database + + The id of the news item to edit + The news object that contains updated values + The updated news item + The news item must be authored by the user and must not be expired and must be unapproved + Get all the slider content for the dashboard slider A list of all the slides for the slider @@ -304,12 +431,12 @@ Sets the membership request to Denied - The id of the membership reuqest in question. - If successful: THe updated membership request wrapped in an OK Http status code. + The id of the membership request in question. + If successful: The updated membership request wrapped in an OK Http status code. - Delets a membership request + Deletes a membership request The id of the membership request to delete The deleted object @@ -352,14 +479,14 @@ Get schedule information of logged in user - Info one gets: privacy, time last updated, description, and Gordon ID + Info one gets: privacy, time last updated, description, and Gordon ID Get schedule information of specific user - Info one gets: privacy, time last updated, description, and Gordon ID + Info one gets: privacy, time last updated, description, and Gordon ID username @@ -378,6 +505,26 @@ New description + + + Gets current wellness status of student + + Json WellnessViewModel + + + + Gets question for wellness check from the back end + + json WellnessQuestionViewModel + + + + Stores the user's wellness check answer, with a timestamp. + If answer boolean is true: student is feeling symptomatic(feeling sick). + If answer boolean is false: student is not feeling symptomatic(feeling fine). + + Ok if message was recorded + Get profile info of currently logged in user @@ -505,7 +652,7 @@ - Get all the activities that have not yet been closed out for the current session for + Get all the activities that have not yet been closed out for the current session for which a given user is the group admin The id of the user who is group admin @@ -687,6 +834,12 @@ The context for the repository + + + Initializes a new instance of the class. + + The context for the repository + Gets single entity by id @@ -781,13 +934,13 @@ Gets entity by Id - + Specific enitity Gets entity by Id - + Specific enitity @@ -799,7 +952,7 @@ Gets all entities - + All entities @@ -956,28 +1109,28 @@ - Gets a collection of all the current open activities, by finding which activities have + Gets a collection of all the current open activities, by finding which activities have memberships with an END_DTE that is null The collection of activity codes for open activities - Gets a collection of all the current open activities for which a given user is group admin, by finding which activities have + Gets a collection of all the current open activities for which a given user is group admin, by finding which activities have memberships with an END_DTE that is null The collection of activity codes for open activities - Gets a collection of all the current activitie already closed out, by finding which activities have + Gets a collection of all the current activitie already closed out, by finding which activities have memberships with an END_DTE that is not null The collection of activity codes for open activities - Gets a collection of all the current closed activities for which a given user is group admin, by finding which activities have + Gets a collection of all the current closed activities for which a given user is group admin, by finding which activities have memberships with an END_DTE that is not null The user's id @@ -986,7 +1139,7 @@ - Updates the Activity Info + Updates the Activity Info The activity info resource with the updated information The id of the activity info to be updated @@ -1085,7 +1238,7 @@ - + @@ -1169,7 +1322,15 @@ Execute the sql query - An sql statment. Can be a stored procedure or even a simple SELECT statment + An sql statement. Can be a stored procedure or even a simple SELECT statement + Parameters to pass into the stored procedure + + + + + Execute the sql query on the StudentTimesheets database + + An sql statement. Can be a stored procedure or even a simple SELECT statment Parameters to pass into the stored procedure @@ -1190,7 +1351,7 @@ Fetches the dashboard slider content from the database. - If found, returns a set of SliderViewModel's, based on each slide entry in the db. + If found, returns a set of SliderViewModel's, based on each slide entry in the db. If not returns an empty IEnumerable. @@ -1323,6 +1484,79 @@ The schedule information The original schedule + + + Gets a news item entity by id + NOTE: Also a helper method, hence why it returns a StudentNews model + rather than a StudentNewsViewModel - must be casted as the latter in its own + controller + + The SNID (id of news item) + The news item + + + + Gets unapproved unexpired news submitted by user. + + user id + username + Result of query + + + + Adds a news item record to storage. + + The news item to be added + username + id + The newly added Membership object + + + + (Service) Deletes a news item from the database + + The id of the news item to delete + The deleted news item + The news item must be authored by the user and must not be expired + + + + (Service) Edits a news item in the database + + The id of the news item to edit + The news object that contains updated values + The updated news item's view model + The news item must be authored by the user and must not be expired and must be unapproved + + + + Helper method to verify that a given news item has not yet been approved + + The news item to verify + true if unapproved, otherwise throws some kind of meaningful exception + + + + Helper method to verify that a given news item has not expired + (see documentation for expiration definition) + + The news item to verify + true if unexpired, otherwise throws some kind of meaningful exception + + + + Helper method to validate a news item + + The news item to validate + True if valid. Throws ResourceNotFoundException if not. Exception is caught in an Exception Filter + + + + Verifies that a student account exists + + The id of the student + true if account exists, ResourceNotFoundException if null + get student profile info @@ -1395,7 +1629,7 @@ id Y or N - + Fetch all upcoming ride items @@ -1408,20 +1642,6 @@ The ride id ride items if found, null if not found - - - Fetch users in a ride specified by a ride_id - - The ride id - IEnumerable of user items if found, null if not found - - - - Adds a new ride record to storage. - - The Save_Rides object to be added - The newly added custom event - Adds a new ride record to storage. @@ -1438,6 +1658,14 @@ The gordon id The myschedule that was just deleted + + + Cancel the ride whose id is specified by the parameter. + + The ride id + The gordon id + The ride that was just deleted + Adds a new booking record to storage. @@ -1453,13 +1681,6 @@ The gordon id The myschedule that was just deleted - - - Fetch number of valid drives (1 or more passengers) by ID - - The gordon id - IEnumerable of user items if found, null if not found - Service Class that facilitates data transactions between the ScheduleControlController and the ScheduleControl part of the database model. @@ -1519,10 +1740,33 @@ id VictoryPromiseViewModel if found, null if not found + + + gets status of wellness check + + id + boolean if found, null if not found + + + + Gets answer to the wellness check answer and sends it to the back end. + If answer boolean is true: student is feeling symptomatic + If answer boolean is false: student is not feeling symptomatic + + id + answer + Ok if message was recorded + + + + gets the question for the wellness check from the back end + + list of strings with questions and prompts + Service class to faclitate data transfers between in and out of the JNZB_ACTIVITIES table. - This is a special class whose contents might not end up being exposed. The original idea + This is a special class whose contents might not end up being exposed. The original idea was for this class to represent all the memberships that would be moved to Jenzibar. We have not reached that point yet though. @@ -1548,7 +1792,7 @@ - Delete the membershipRequest object whose id is given in the parameters + Delete the membershipRequest object whose id is given in the parameters The membership request id A copy of the deleted membership request @@ -1615,6 +1859,13 @@ The membership id The membership that was just deleted + + + Fetch the membership whose id is specified by the parameter + + The membership id + MembershipViewModel if found, null if not found + Fetches all membership records from storage. @@ -1715,7 +1966,7 @@ Helper method to Validate a membership The membership to validate - True if the membership is valid. Throws ResourceNotFoundException if not. Exception is cauth in an Exception Filter + True if the membership is valid. Throws ResourceNotFoundException if not. Exception is caught in an Exception Filter @@ -1753,7 +2004,7 @@ - Return an XDocument from a URL containing XML. + Return an XDocument from a URL containing XML. This is used to retrieve data from 25Live specifically. diff --git a/Gordon360/Exceptions/CustomExcpetionFilter.cs b/Gordon360/Exceptions/CustomExceptionFilter.cs similarity index 67% rename from Gordon360/Exceptions/CustomExcpetionFilter.cs rename to Gordon360/Exceptions/CustomExceptionFilter.cs index a6de8cd0d..7e176d018 100644 --- a/Gordon360/Exceptions/CustomExcpetionFilter.cs +++ b/Gordon360/Exceptions/CustomExceptionFilter.cs @@ -1,27 +1,30 @@ -using System; -using System.Net.Http; +using System.Net.Http; using System.Web.Http.Filters; using Gordon360.Exceptions.CustomExceptions; +/// +/// These exception filters catch unhandled exceptions and convert them +/// into HTTP Responses +/// namespace Gordon360.Exceptions.ExceptionFilters { public class CustomExceptionFilter : ExceptionFilterAttribute { public override void OnException(HttpActionExecutedContext actionExecutedContext) { - + // RESOURCE NOT FOUND if (actionExecutedContext.Exception is ResourceNotFoundException) { var exception = actionExecutedContext.Exception as ResourceNotFoundException; actionExecutedContext.Response = new HttpResponseMessage() { - StatusCode = System.Net.HttpStatusCode.NotFound, Content = new StringContent(exception.ExceptionMessage), - ReasonPhrase = "LOL" + //ReasonPhrase = "LOL" }; } + // RESOURCE CREATION CONFLICT else if (actionExecutedContext.Exception is ResourceCreationException) { var exception = actionExecutedContext.Exception as ResourceCreationException; @@ -32,6 +35,7 @@ public override void OnException(HttpActionExecutedContext actionExecutedContext }; } + // BAD INPUT else if( actionExecutedContext.Exception is BadInputException) { var exception = actionExecutedContext.Exception as BadInputException; @@ -41,6 +45,17 @@ public override void OnException(HttpActionExecutedContext actionExecutedContext Content = new StringContent(exception.ExceptionMessage) }; } + + // UNAUTHORIZED ACCESS EXCEPTION + else if (actionExecutedContext.Exception is UnauthorizedAccessException) + { + var exception = actionExecutedContext.Exception as UnauthorizedAccessException; + actionExecutedContext.Response = new HttpResponseMessage() + { + StatusCode = System.Net.HttpStatusCode.Unauthorized, + Content = new StringContent(exception.ExceptionMessage) + }; + } } } } \ No newline at end of file diff --git a/Gordon360/Exceptions/CustomExceptions.cs b/Gordon360/Exceptions/CustomExceptions.cs index 82b73dc76..e1d33889d 100644 --- a/Gordon360/Exceptions/CustomExceptions.cs +++ b/Gordon360/Exceptions/CustomExceptions.cs @@ -1,6 +1,6 @@ using System; // -// Namespace where we will define custom exceptions to be throwl later on. +// Namespace where we will define custom exceptions to be thrown later on. // namespace Gordon360.Exceptions.CustomExceptions { @@ -8,7 +8,6 @@ public class ResourceNotFoundException : Exception { public string ExceptionMessage { get; set; } } - public class ResourceCreationException : Exception { public string ExceptionMessage { get; set; } @@ -17,4 +16,8 @@ public class BadInputException : Exception { public string ExceptionMessage { get; set; } } -} \ No newline at end of file + public class UnauthorizedAccessException : Exception + { + public string ExceptionMessage { get; set; } + } +} diff --git a/Gordon360/Gordon360.csproj b/Gordon360/Gordon360.csproj index b5f119c9c..61b24bff7 100644 --- a/Gordon360/Gordon360.csproj +++ b/Gordon360/Gordon360.csproj @@ -204,6 +204,7 @@ + @@ -214,6 +215,7 @@ + CCT_DB_Models.tt @@ -268,11 +270,14 @@ CCT_DB_Models.tt + + MyGordon_DB_Models.tt + CCT_DB_Models.tt - CCT_DB_Models.tt + MyGordon_DB_Models.tt CCT_DB_Models.tt @@ -298,6 +303,15 @@ CCT_DB_Models.tt + + MyGordon_DB_Models.tt + + + MyGordon_DB_Models.tt + + + MyGordon_DB_Models.tt + CCT_DB_Models.tt @@ -337,12 +351,36 @@ CCT_DB_Models.tt + + True + True + MyGordon_DB_Models.Context.tt + + + True + True + MyGordon_DB_Models.tt + + + True + True + MyGordon_DB_Models.edmx + CCT_DB_Models.tt CCT_DB_Models.tt + + CCT_DB_Models.tt + + + CCT_DB_Models.tt + + + CCT_DB_Models.tt + CCT_DB_Models.tt @@ -376,12 +414,25 @@ CCT_DB_Models.tt - - + + MyGordon_DB_Models.tt + + + MyGordon_DB_Models.tt + CCT_DB_Models.tt + + MyGordon_DB_Models.tt + + + MyGordon_DB_Models.tt + + + CCT_DB_Models.tt + True True @@ -400,7 +451,7 @@ CCT_DB_Models.tt - + StudentTimesheet_DB_Models.tt @@ -434,6 +485,10 @@ CCT_DB_Models.tt + + + + @@ -454,7 +509,7 @@ - + @@ -488,6 +543,20 @@ + + + MyGordon_DB_Models.tt + + + MyGordon_DB_Models.tt + + + MyGordon_DB_Models.tt + + + MyGordon_DB_Models.tt + + @@ -505,6 +574,7 @@ + @@ -512,6 +582,7 @@ + @@ -525,6 +596,33 @@ + + EntityModelCodeGenerator + StudentTimesheet_DB_Models.Designer.cs + + + TextTemplatingFileGenerator + CCT_DB_Models.edmx + CCT_DB_Models.Context.cs + + + TextTemplatingFileGenerator + CCT_DB_Models.edmx + CCT_DB_Models.cs + + + TextTemplatingFileGenerator + MyGordon_DB_Models.edmx + MyGordon_DB_Models.Context.cs + + + TextTemplatingFileGenerator + MyGordon_DB_Models.edmx + MyGordon_DB_Models.cs + + + StudentTimesheet_DB_Models.edmx + EntityModelCodeGenerator CCT_DB_Models.Designer.cs @@ -532,12 +630,12 @@ CCT_DB_Models.edmx - + EntityModelCodeGenerator - StudentTimesheet_DB_Models.Designer.cs + MyGordon_DB_Models.Designer.cs - - StudentTimesheet_DB_Models.edmx + + MyGordon_DB_Models.edmx Designer @@ -545,15 +643,15 @@ Always - + TextTemplatingFileGenerator - CCT_DB_Models.edmx - CCT_DB_Models.Context.cs + StudentTimesheet_DB_Models.edmx + StudentTimesheet_DB_Models.Context.cs - + TextTemplatingFileGenerator - CCT_DB_Models.edmx - CCT_DB_Models.cs + StudentTimesheet_DB_Models.edmx + StudentTimesheet_DB_Models.cs TextTemplatingFileGenerator diff --git a/Gordon360/Models/CCT_DB_MODELS.Context.cs b/Gordon360/Models/CCT_DB_MODELS.Context.cs index b42468d84..b48aa88c6 100644 --- a/Gordon360/Models/CCT_DB_MODELS.Context.cs +++ b/Gordon360/Models/CCT_DB_MODELS.Context.cs @@ -14,19 +14,19 @@ namespace Gordon360.Models using System.Data.Entity.Infrastructure; using System.Data.Entity.Core.Objects; using System.Linq; - + public partial class CCTEntities1 : DbContext { public CCTEntities1() : base("name=CCTEntities1") { } - + protected override void OnModelCreating(DbModelBuilder modelBuilder) { throw new UnintentionalCodeFirstException(); } - + public virtual DbSet ACT_INFO { get; set; } public virtual DbSet ADMIN { get; set; } public virtual DbSet CUSTOM_PROFILE { get; set; } @@ -38,7 +38,10 @@ protected override void OnModelCreating(DbModelBuilder modelBuilder) public virtual DbSet Save_Bookings { get; set; } public virtual DbSet Save_Rides { get; set; } public virtual DbSet Schedule_Control { get; set; } + public virtual DbSet StudentNewsExpiration { get; set; } public virtual DbSet sysdiagrams { get; set; } + public virtual DbSet Transit_Requests { get; set; } + public virtual DbSet Transit_Rides { get; set; } public virtual DbSet C360_SLIDER { get; set; } public virtual DbSet ACCOUNT { get; set; } public virtual DbSet Alumni { get; set; } @@ -56,732 +59,783 @@ protected override void OnModelCreating(DbModelBuilder modelBuilder) public virtual DbSet PART_DEF { get; set; } public virtual DbSet RoomAssign { get; set; } public virtual DbSet Student { get; set; } - + public virtual DbSet StudentNews { get; set; } + public virtual DbSet StudentNewsCategory { get; set; } + public virtual ObjectResult ACTIVE_CLUBS_PER_SESS_ID(string sESS_CDE) { var sESS_CDEParameter = sESS_CDE != null ? new ObjectParameter("SESS_CDE", sESS_CDE) : new ObjectParameter("SESS_CDE", typeof(string)); - + return ((IObjectContextAdapter)this).ObjectContext.ExecuteFunction("ACTIVE_CLUBS_PER_SESS_ID", sESS_CDEParameter); } - + public virtual ObjectResult ADVISOR_EMAILS_PER_ACT_CDE(string aCT_CDE, string sESS_CDE) { var aCT_CDEParameter = aCT_CDE != null ? new ObjectParameter("ACT_CDE", aCT_CDE) : new ObjectParameter("ACT_CDE", typeof(string)); - + var sESS_CDEParameter = sESS_CDE != null ? new ObjectParameter("SESS_CDE", sESS_CDE) : new ObjectParameter("SESS_CDE", typeof(string)); - + return ((IObjectContextAdapter)this).ObjectContext.ExecuteFunction("ADVISOR_EMAILS_PER_ACT_CDE", aCT_CDEParameter, sESS_CDEParameter); } - + public virtual ObjectResult ALL_BASIC_INFO() { return ((IObjectContextAdapter)this).ObjectContext.ExecuteFunction("ALL_BASIC_INFO"); } - + public virtual ObjectResult ALL_BASIC_INFO_NOT_ALUMNI() { return ((IObjectContextAdapter)this).ObjectContext.ExecuteFunction("ALL_BASIC_INFO_NOT_ALUMNI"); } - + public virtual ObjectResult ALL_MEMBERSHIPS() { return ((IObjectContextAdapter)this).ObjectContext.ExecuteFunction("ALL_MEMBERSHIPS"); } - + public virtual ObjectResult ALL_REQUESTS() { return ((IObjectContextAdapter)this).ObjectContext.ExecuteFunction("ALL_REQUESTS"); } - + public virtual int ALL_SUPERVISORS() { return ((IObjectContextAdapter)this).ObjectContext.ExecuteFunction("ALL_SUPERVISORS"); } - + + public virtual int CANCEL_RIDE(Nullable sTUDENT_ID, string rIDE_ID) + { + var sTUDENT_IDParameter = sTUDENT_ID.HasValue ? + new ObjectParameter("STUDENT_ID", sTUDENT_ID) : + new ObjectParameter("STUDENT_ID", typeof(int)); + + var rIDE_IDParameter = rIDE_ID != null ? + new ObjectParameter("RIDE_ID", rIDE_ID) : + new ObjectParameter("RIDE_ID", typeof(string)); + + return ((IObjectContextAdapter)this).ObjectContext.ExecuteFunction("CANCEL_RIDE", sTUDENT_IDParameter, rIDE_IDParameter); + } + public virtual ObjectResult COURSES_FOR_PROFESSOR(Nullable professor_id, string sess_cde) { var professor_idParameter = professor_id.HasValue ? new ObjectParameter("professor_id", professor_id) : new ObjectParameter("professor_id", typeof(int)); - + var sess_cdeParameter = sess_cde != null ? new ObjectParameter("sess_cde", sess_cde) : new ObjectParameter("sess_cde", typeof(string)); - + return ((IObjectContextAdapter)this).ObjectContext.ExecuteFunction("COURSES_FOR_PROFESSOR", professor_idParameter, sess_cdeParameter); } - + + public virtual int CREATE_BOOKING(string iD, string rIDEID, Nullable iSDRIVER) + { + var iDParameter = iD != null ? + new ObjectParameter("ID", iD) : + new ObjectParameter("ID", typeof(string)); + + var rIDEIDParameter = rIDEID != null ? + new ObjectParameter("RIDEID", rIDEID) : + new ObjectParameter("RIDEID", typeof(string)); + + var iSDRIVERParameter = iSDRIVER.HasValue ? + new ObjectParameter("ISDRIVER", iSDRIVER) : + new ObjectParameter("ISDRIVER", typeof(byte)); + + return ((IObjectContextAdapter)this).ObjectContext.ExecuteFunction("CREATE_BOOKING", iDParameter, rIDEIDParameter, iSDRIVERParameter); + } + public virtual int CREATE_MYSCHEDULE(string eVENTID, string gORDONID, string lOCATION, string dESCRIPTION, string mON_CDE, string tUE_CDE, string wED_CDE, string tHU_CDE, string fRI_CDE, string sAT_CDE, string sUN_CDE, Nullable iS_ALLDAY, Nullable bEGINTIME, Nullable eNDTIME) { var eVENTIDParameter = eVENTID != null ? new ObjectParameter("EVENTID", eVENTID) : new ObjectParameter("EVENTID", typeof(string)); - + var gORDONIDParameter = gORDONID != null ? new ObjectParameter("GORDONID", gORDONID) : new ObjectParameter("GORDONID", typeof(string)); - + var lOCATIONParameter = lOCATION != null ? new ObjectParameter("LOCATION", lOCATION) : new ObjectParameter("LOCATION", typeof(string)); - + var dESCRIPTIONParameter = dESCRIPTION != null ? new ObjectParameter("DESCRIPTION", dESCRIPTION) : new ObjectParameter("DESCRIPTION", typeof(string)); - + var mON_CDEParameter = mON_CDE != null ? new ObjectParameter("MON_CDE", mON_CDE) : new ObjectParameter("MON_CDE", typeof(string)); - + var tUE_CDEParameter = tUE_CDE != null ? new ObjectParameter("TUE_CDE", tUE_CDE) : new ObjectParameter("TUE_CDE", typeof(string)); - + var wED_CDEParameter = wED_CDE != null ? new ObjectParameter("WED_CDE", wED_CDE) : new ObjectParameter("WED_CDE", typeof(string)); - + var tHU_CDEParameter = tHU_CDE != null ? new ObjectParameter("THU_CDE", tHU_CDE) : new ObjectParameter("THU_CDE", typeof(string)); - + var fRI_CDEParameter = fRI_CDE != null ? new ObjectParameter("FRI_CDE", fRI_CDE) : new ObjectParameter("FRI_CDE", typeof(string)); - + var sAT_CDEParameter = sAT_CDE != null ? new ObjectParameter("SAT_CDE", sAT_CDE) : new ObjectParameter("SAT_CDE", typeof(string)); - + var sUN_CDEParameter = sUN_CDE != null ? new ObjectParameter("SUN_CDE", sUN_CDE) : new ObjectParameter("SUN_CDE", typeof(string)); - + var iS_ALLDAYParameter = iS_ALLDAY.HasValue ? new ObjectParameter("IS_ALLDAY", iS_ALLDAY) : new ObjectParameter("IS_ALLDAY", typeof(int)); - + var bEGINTIMEParameter = bEGINTIME.HasValue ? new ObjectParameter("BEGINTIME", bEGINTIME) : new ObjectParameter("BEGINTIME", typeof(System.TimeSpan)); - + var eNDTIMEParameter = eNDTIME.HasValue ? new ObjectParameter("ENDTIME", eNDTIME) : new ObjectParameter("ENDTIME", typeof(System.TimeSpan)); - + return ((IObjectContextAdapter)this).ObjectContext.ExecuteFunction("CREATE_MYSCHEDULE", eVENTIDParameter, gORDONIDParameter, lOCATIONParameter, dESCRIPTIONParameter, mON_CDEParameter, tUE_CDEParameter, wED_CDEParameter, tHU_CDEParameter, fRI_CDEParameter, sAT_CDEParameter, sUN_CDEParameter, iS_ALLDAYParameter, bEGINTIMEParameter, eNDTIMEParameter); } - + public virtual int CREATE_RIDE(string rIDEID, string dESTINATION, string mEETINGPOINT, Nullable sTARTTIME, Nullable eNDTIME, Nullable cAPACITY, string nOTES, Nullable cANCELED) { var rIDEIDParameter = rIDEID != null ? new ObjectParameter("RIDEID", rIDEID) : new ObjectParameter("RIDEID", typeof(string)); - + var dESTINATIONParameter = dESTINATION != null ? new ObjectParameter("DESTINATION", dESTINATION) : new ObjectParameter("DESTINATION", typeof(string)); - + var mEETINGPOINTParameter = mEETINGPOINT != null ? new ObjectParameter("MEETINGPOINT", mEETINGPOINT) : new ObjectParameter("MEETINGPOINT", typeof(string)); - + var sTARTTIMEParameter = sTARTTIME.HasValue ? new ObjectParameter("STARTTIME", sTARTTIME) : new ObjectParameter("STARTTIME", typeof(System.DateTime)); - + var eNDTIMEParameter = eNDTIME.HasValue ? new ObjectParameter("ENDTIME", eNDTIME) : new ObjectParameter("ENDTIME", typeof(System.DateTime)); - + var cAPACITYParameter = cAPACITY.HasValue ? new ObjectParameter("CAPACITY", cAPACITY) : new ObjectParameter("CAPACITY", typeof(int)); - + var nOTESParameter = nOTES != null ? new ObjectParameter("NOTES", nOTES) : new ObjectParameter("NOTES", typeof(string)); - + var cANCELEDParameter = cANCELED.HasValue ? new ObjectParameter("CANCELED", cANCELED) : new ObjectParameter("CANCELED", typeof(byte)); - + return ((IObjectContextAdapter)this).ObjectContext.ExecuteFunction("CREATE_RIDE", rIDEIDParameter, dESTINATIONParameter, mEETINGPOINTParameter, sTARTTIMEParameter, eNDTIMEParameter, cAPACITYParameter, nOTESParameter, cANCELEDParameter); } - + public virtual int CREATE_SOCIAL_LINKS(string uSERNAME, string fACEBOOK, string tWITTER, string iNSTAGRAM, string lINKEDIN) { var uSERNAMEParameter = uSERNAME != null ? new ObjectParameter("USERNAME", uSERNAME) : new ObjectParameter("USERNAME", typeof(string)); - + var fACEBOOKParameter = fACEBOOK != null ? new ObjectParameter("FACEBOOK", fACEBOOK) : new ObjectParameter("FACEBOOK", typeof(string)); - + var tWITTERParameter = tWITTER != null ? new ObjectParameter("TWITTER", tWITTER) : new ObjectParameter("TWITTER", typeof(string)); - + var iNSTAGRAMParameter = iNSTAGRAM != null ? new ObjectParameter("INSTAGRAM", iNSTAGRAM) : new ObjectParameter("INSTAGRAM", typeof(string)); - + var lINKEDINParameter = lINKEDIN != null ? new ObjectParameter("LINKEDIN", lINKEDIN) : new ObjectParameter("LINKEDIN", typeof(string)); - + return ((IObjectContextAdapter)this).ObjectContext.ExecuteFunction("CREATE_SOCIAL_LINKS", uSERNAMEParameter, fACEBOOKParameter, tWITTERParameter, iNSTAGRAMParameter, lINKEDINParameter); } - + public virtual ObjectResult CURRENT_SESSION() { return ((IObjectContextAdapter)this).ObjectContext.ExecuteFunction("CURRENT_SESSION"); } - + public virtual int DELETE_BOOKING(string rIDE_ID, string iD) { var rIDE_IDParameter = rIDE_ID != null ? new ObjectParameter("RIDE_ID", rIDE_ID) : new ObjectParameter("RIDE_ID", typeof(string)); - + var iDParameter = iD != null ? new ObjectParameter("ID", iD) : new ObjectParameter("ID", typeof(string)); - + return ((IObjectContextAdapter)this).ObjectContext.ExecuteFunction("DELETE_BOOKING", rIDE_IDParameter, iDParameter); } - + public virtual int DELETE_BOOKINGS(string rIDE_ID) { var rIDE_IDParameter = rIDE_ID != null ? new ObjectParameter("RIDE_ID", rIDE_ID) : new ObjectParameter("RIDE_ID", typeof(string)); - + return ((IObjectContextAdapter)this).ObjectContext.ExecuteFunction("DELETE_BOOKINGS", rIDE_IDParameter); } - + public virtual int DELETE_MYSCHEDULE(string eVENTID, string gORDONID) { var eVENTIDParameter = eVENTID != null ? new ObjectParameter("EVENTID", eVENTID) : new ObjectParameter("EVENTID", typeof(string)); - + var gORDONIDParameter = gORDONID != null ? new ObjectParameter("GORDONID", gORDONID) : new ObjectParameter("GORDONID", typeof(string)); - + return ((IObjectContextAdapter)this).ObjectContext.ExecuteFunction("DELETE_MYSCHEDULE", eVENTIDParameter, gORDONIDParameter); } - + public virtual int DELETE_RIDE(string rIDE_ID) { var rIDE_IDParameter = rIDE_ID != null ? new ObjectParameter("RIDE_ID", rIDE_ID) : new ObjectParameter("RIDE_ID", typeof(string)); - + return ((IObjectContextAdapter)this).ObjectContext.ExecuteFunction("DELETE_RIDE", rIDE_IDParameter); } - + public virtual ObjectResult DINING_INFO_BY_STUDENT_ID(Nullable sTUDENT_ID, string sESS_CDE) { var sTUDENT_IDParameter = sTUDENT_ID.HasValue ? new ObjectParameter("STUDENT_ID", sTUDENT_ID) : new ObjectParameter("STUDENT_ID", typeof(int)); - + var sESS_CDEParameter = sESS_CDE != null ? new ObjectParameter("SESS_CDE", sESS_CDE) : new ObjectParameter("SESS_CDE", typeof(string)); - + return ((IObjectContextAdapter)this).ObjectContext.ExecuteFunction("DINING_INFO_BY_STUDENT_ID", sTUDENT_IDParameter, sESS_CDEParameter); } - + public virtual ObjectResult DISTINCT_ACT_TYPE(string sESS_CDE) { var sESS_CDEParameter = sESS_CDE != null ? new ObjectParameter("SESS_CDE", sESS_CDE) : new ObjectParameter("SESS_CDE", typeof(string)); - + return ((IObjectContextAdapter)this).ObjectContext.ExecuteFunction("DISTINCT_ACT_TYPE", sESS_CDEParameter); } - + public virtual ObjectResult EMAILS_PER_ACT_CDE(string aCT_CDE, string sESS_CDE) { var aCT_CDEParameter = aCT_CDE != null ? new ObjectParameter("ACT_CDE", aCT_CDE) : new ObjectParameter("ACT_CDE", typeof(string)); - + var sESS_CDEParameter = sESS_CDE != null ? new ObjectParameter("SESS_CDE", sESS_CDE) : new ObjectParameter("SESS_CDE", typeof(string)); - + return ((IObjectContextAdapter)this).ObjectContext.ExecuteFunction("EMAILS_PER_ACT_CDE", aCT_CDEParameter, sESS_CDEParameter); } - + public virtual ObjectResult EVENTS_BY_STUDENT_ID(string sTU_USERNAME) { var sTU_USERNAMEParameter = sTU_USERNAME != null ? new ObjectParameter("STU_USERNAME", sTU_USERNAME) : new ObjectParameter("STU_USERNAME", typeof(string)); - + return ((IObjectContextAdapter)this).ObjectContext.ExecuteFunction("EVENTS_BY_STUDENT_ID", sTU_USERNAMEParameter); } - + public virtual ObjectResult GRP_ADMIN_EMAILS_PER_ACT_CDE(string aCT_CDE, string sESS_CDE) { var aCT_CDEParameter = aCT_CDE != null ? new ObjectParameter("ACT_CDE", aCT_CDE) : new ObjectParameter("ACT_CDE", typeof(string)); - + var sESS_CDEParameter = sESS_CDE != null ? new ObjectParameter("SESS_CDE", sESS_CDE) : new ObjectParameter("SESS_CDE", typeof(string)); - + return ((IObjectContextAdapter)this).ObjectContext.ExecuteFunction("GRP_ADMIN_EMAILS_PER_ACT_CDE", aCT_CDEParameter, sESS_CDEParameter); } - + public virtual ObjectResult INSTRUCTOR_COURSES_BY_ID_NUM_AND_SESS_CDE(Nullable instructor_id, string sess_cde) { var instructor_idParameter = instructor_id.HasValue ? new ObjectParameter("instructor_id", instructor_id) : new ObjectParameter("instructor_id", typeof(int)); - + var sess_cdeParameter = sess_cde != null ? new ObjectParameter("sess_cde", sess_cde) : new ObjectParameter("sess_cde", typeof(string)); - + return ((IObjectContextAdapter)this).ObjectContext.ExecuteFunction("INSTRUCTOR_COURSES_BY_ID_NUM_AND_SESS_CDE", instructor_idParameter, sess_cdeParameter); } - + public virtual ObjectResult LEADER_EMAILS_PER_ACT_CDE(string aCT_CDE, string sESS_CDE) { var aCT_CDEParameter = aCT_CDE != null ? new ObjectParameter("ACT_CDE", aCT_CDE) : new ObjectParameter("ACT_CDE", typeof(string)); - + var sESS_CDEParameter = sESS_CDE != null ? new ObjectParameter("SESS_CDE", sESS_CDE) : new ObjectParameter("SESS_CDE", typeof(string)); - + return ((IObjectContextAdapter)this).ObjectContext.ExecuteFunction("LEADER_EMAILS_PER_ACT_CDE", aCT_CDEParameter, sESS_CDEParameter); } - + public virtual ObjectResult LEADER_MEMBERSHIPS_PER_ACT_CDE(string aCT_CDE) { var aCT_CDEParameter = aCT_CDE != null ? new ObjectParameter("ACT_CDE", aCT_CDE) : new ObjectParameter("ACT_CDE", typeof(string)); - + return ((IObjectContextAdapter)this).ObjectContext.ExecuteFunction("LEADER_MEMBERSHIPS_PER_ACT_CDE", aCT_CDEParameter); } - + public virtual ObjectResult MEMBERSHIPS_PER_ACT_CDE(string aCT_CDE) { var aCT_CDEParameter = aCT_CDE != null ? new ObjectParameter("ACT_CDE", aCT_CDE) : new ObjectParameter("ACT_CDE", typeof(string)); - + return ((IObjectContextAdapter)this).ObjectContext.ExecuteFunction("MEMBERSHIPS_PER_ACT_CDE", aCT_CDEParameter); } - + public virtual ObjectResult MEMBERSHIPS_PER_STUDENT_ID(Nullable sTUDENT_ID) { var sTUDENT_IDParameter = sTUDENT_ID.HasValue ? new ObjectParameter("STUDENT_ID", sTUDENT_ID) : new ObjectParameter("STUDENT_ID", typeof(int)); - + return ((IObjectContextAdapter)this).ObjectContext.ExecuteFunction("MEMBERSHIPS_PER_STUDENT_ID", sTUDENT_IDParameter); } - + public virtual ObjectResult MYSCHEDULE_BY_ID(Nullable iD_NUM) { var iD_NUMParameter = iD_NUM.HasValue ? new ObjectParameter("ID_NUM", iD_NUM) : new ObjectParameter("ID_NUM", typeof(int)); - + return ((IObjectContextAdapter)this).ObjectContext.ExecuteFunction("MYSCHEDULE_BY_ID", iD_NUMParameter); } - + + public virtual ObjectResult NEWS_CATEGORIES() + { + return ((IObjectContextAdapter)this).ObjectContext.ExecuteFunction("NEWS_CATEGORIES"); + } + + public virtual ObjectResult NEWS_NEW() + { + return ((IObjectContextAdapter)this).ObjectContext.ExecuteFunction("NEWS_NEW"); + } + + public virtual ObjectResult NEWS_NOT_EXPIRED() + { + return ((IObjectContextAdapter)this).ObjectContext.ExecuteFunction("NEWS_NOT_EXPIRED"); + } + public virtual ObjectResult PHOTO_INFO_PER_USER_NAME(Nullable iD) { var iDParameter = iD.HasValue ? new ObjectParameter("ID", iD) : new ObjectParameter("ID", typeof(int)); - + return ((IObjectContextAdapter)this).ObjectContext.ExecuteFunction("PHOTO_INFO_PER_USER_NAME", iDParameter); } - + public virtual ObjectResult REQUEST_PER_REQUEST_ID(Nullable rEQUEST_ID) { var rEQUEST_IDParameter = rEQUEST_ID.HasValue ? new ObjectParameter("REQUEST_ID", rEQUEST_ID) : new ObjectParameter("REQUEST_ID", typeof(int)); - + return ((IObjectContextAdapter)this).ObjectContext.ExecuteFunction("REQUEST_PER_REQUEST_ID", rEQUEST_IDParameter); } - + public virtual ObjectResult REQUESTS_PER_ACT_CDE(string aCT_CDE) { var aCT_CDEParameter = aCT_CDE != null ? new ObjectParameter("ACT_CDE", aCT_CDE) : new ObjectParameter("ACT_CDE", typeof(string)); - + return ((IObjectContextAdapter)this).ObjectContext.ExecuteFunction("REQUESTS_PER_ACT_CDE", aCT_CDEParameter); } - + public virtual ObjectResult REQUESTS_PER_STUDENT_ID(Nullable sTUDENT_ID) { var sTUDENT_IDParameter = sTUDENT_ID.HasValue ? new ObjectParameter("STUDENT_ID", sTUDENT_ID) : new ObjectParameter("STUDENT_ID", typeof(int)); - + return ((IObjectContextAdapter)this).ObjectContext.ExecuteFunction("REQUESTS_PER_STUDENT_ID", sTUDENT_IDParameter); } - + public virtual ObjectResult RIDERS_BY_RIDE_ID(string rIDE_ID) { var rIDE_IDParameter = rIDE_ID != null ? new ObjectParameter("RIDE_ID", rIDE_ID) : new ObjectParameter("RIDE_ID", typeof(string)); - + return ((IObjectContextAdapter)this).ObjectContext.ExecuteFunction("RIDERS_BY_RIDE_ID", rIDE_IDParameter); } - + public virtual int sp_alterdiagram(string diagramname, Nullable owner_id, Nullable version, byte[] definition) { var diagramnameParameter = diagramname != null ? new ObjectParameter("diagramname", diagramname) : new ObjectParameter("diagramname", typeof(string)); - + var owner_idParameter = owner_id.HasValue ? new ObjectParameter("owner_id", owner_id) : new ObjectParameter("owner_id", typeof(int)); - + var versionParameter = version.HasValue ? new ObjectParameter("version", version) : new ObjectParameter("version", typeof(int)); - + var definitionParameter = definition != null ? new ObjectParameter("definition", definition) : new ObjectParameter("definition", typeof(byte[])); - + return ((IObjectContextAdapter)this).ObjectContext.ExecuteFunction("sp_alterdiagram", diagramnameParameter, owner_idParameter, versionParameter, definitionParameter); } - + public virtual int sp_creatediagram(string diagramname, Nullable owner_id, Nullable version, byte[] definition) { var diagramnameParameter = diagramname != null ? new ObjectParameter("diagramname", diagramname) : new ObjectParameter("diagramname", typeof(string)); - + var owner_idParameter = owner_id.HasValue ? new ObjectParameter("owner_id", owner_id) : new ObjectParameter("owner_id", typeof(int)); - + var versionParameter = version.HasValue ? new ObjectParameter("version", version) : new ObjectParameter("version", typeof(int)); - + var definitionParameter = definition != null ? new ObjectParameter("definition", definition) : new ObjectParameter("definition", typeof(byte[])); - + return ((IObjectContextAdapter)this).ObjectContext.ExecuteFunction("sp_creatediagram", diagramnameParameter, owner_idParameter, versionParameter, definitionParameter); } - + public virtual int sp_dropdiagram(string diagramname, Nullable owner_id) { var diagramnameParameter = diagramname != null ? new ObjectParameter("diagramname", diagramname) : new ObjectParameter("diagramname", typeof(string)); - + var owner_idParameter = owner_id.HasValue ? new ObjectParameter("owner_id", owner_id) : new ObjectParameter("owner_id", typeof(int)); - + return ((IObjectContextAdapter)this).ObjectContext.ExecuteFunction("sp_dropdiagram", diagramnameParameter, owner_idParameter); } - + public virtual ObjectResult sp_helpdiagramdefinition(string diagramname, Nullable owner_id) { var diagramnameParameter = diagramname != null ? new ObjectParameter("diagramname", diagramname) : new ObjectParameter("diagramname", typeof(string)); - + var owner_idParameter = owner_id.HasValue ? new ObjectParameter("owner_id", owner_id) : new ObjectParameter("owner_id", typeof(int)); - + return ((IObjectContextAdapter)this).ObjectContext.ExecuteFunction("sp_helpdiagramdefinition", diagramnameParameter, owner_idParameter); } - + public virtual ObjectResult sp_helpdiagrams(string diagramname, Nullable owner_id) { var diagramnameParameter = diagramname != null ? new ObjectParameter("diagramname", diagramname) : new ObjectParameter("diagramname", typeof(string)); - + var owner_idParameter = owner_id.HasValue ? new ObjectParameter("owner_id", owner_id) : new ObjectParameter("owner_id", typeof(int)); - + return ((IObjectContextAdapter)this).ObjectContext.ExecuteFunction("sp_helpdiagrams", diagramnameParameter, owner_idParameter); } - + public virtual int sp_renamediagram(string diagramname, Nullable owner_id, string new_diagramname) { var diagramnameParameter = diagramname != null ? new ObjectParameter("diagramname", diagramname) : new ObjectParameter("diagramname", typeof(string)); - + var owner_idParameter = owner_id.HasValue ? new ObjectParameter("owner_id", owner_id) : new ObjectParameter("owner_id", typeof(int)); - + var new_diagramnameParameter = new_diagramname != null ? new ObjectParameter("new_diagramname", new_diagramname) : new ObjectParameter("new_diagramname", typeof(string)); - + return ((IObjectContextAdapter)this).ObjectContext.ExecuteFunction("sp_renamediagram", diagramnameParameter, owner_idParameter, new_diagramnameParameter); } - + public virtual int sp_upgraddiagrams() { return ((IObjectContextAdapter)this).ObjectContext.ExecuteFunction("sp_upgraddiagrams"); } - + public virtual ObjectResult STUDENT_COURSES_BY_ID_NUM_AND_SESS_CDE(Nullable id_num, string sess_cde) { var id_numParameter = id_num.HasValue ? new ObjectParameter("id_num", id_num) : new ObjectParameter("id_num", typeof(int)); - + var sess_cdeParameter = sess_cde != null ? new ObjectParameter("sess_cde", sess_cde) : new ObjectParameter("sess_cde", typeof(string)); - + return ((IObjectContextAdapter)this).ObjectContext.ExecuteFunction("STUDENT_COURSES_BY_ID_NUM_AND_SESS_CDE", id_numParameter, sess_cdeParameter); } - + public virtual int STUDENT_JOBS_PER_ID_NUM(Nullable iD_NUM) { var iD_NUMParameter = iD_NUM.HasValue ? new ObjectParameter("ID_NUM", iD_NUM) : new ObjectParameter("ID_NUM", typeof(int)); - + return ((IObjectContextAdapter)this).ObjectContext.ExecuteFunction("STUDENT_JOBS_PER_ID_NUM", iD_NUMParameter); } - + public virtual int SUPERVISOR_PER_SUP_ID(Nullable sUP_ID) { var sUP_IDParameter = sUP_ID.HasValue ? new ObjectParameter("SUP_ID", sUP_ID) : new ObjectParameter("SUP_ID", typeof(int)); - + return ((IObjectContextAdapter)this).ObjectContext.ExecuteFunction("SUPERVISOR_PER_SUP_ID", sUP_IDParameter); } - + public virtual int SUPERVISORS_PER_ACT_CDE(string aCT_CDE) { var aCT_CDEParameter = aCT_CDE != null ? new ObjectParameter("ACT_CDE", aCT_CDE) : new ObjectParameter("ACT_CDE", typeof(string)); - + return ((IObjectContextAdapter)this).ObjectContext.ExecuteFunction("SUPERVISORS_PER_ACT_CDE", aCT_CDEParameter); } - + public virtual int SUPERVISORS_PER_ID_NUM(Nullable iD_NUM) { var iD_NUMParameter = iD_NUM.HasValue ? new ObjectParameter("ID_NUM", iD_NUM) : new ObjectParameter("ID_NUM", typeof(int)); - + return ((IObjectContextAdapter)this).ObjectContext.ExecuteFunction("SUPERVISORS_PER_ID_NUM", iD_NUMParameter); } - - public virtual ObjectResult UPCOMING_RIDES() + + public virtual ObjectResult UPCOMING_RIDES(Nullable sTUDENT_ID) { - return ((IObjectContextAdapter)this).ObjectContext.ExecuteFunction("UPCOMING_RIDES"); + var sTUDENT_IDParameter = sTUDENT_ID.HasValue ? + new ObjectParameter("STUDENT_ID", sTUDENT_ID) : + new ObjectParameter("STUDENT_ID", typeof(int)); + + return ((IObjectContextAdapter)this).ObjectContext.ExecuteFunction("UPCOMING_RIDES", sTUDENT_IDParameter); } - + public virtual ObjectResult UPCOMING_RIDES_BY_STUDENT_ID(Nullable sTUDENT_ID) { var sTUDENT_IDParameter = sTUDENT_ID.HasValue ? new ObjectParameter("STUDENT_ID", sTUDENT_ID) : new ObjectParameter("STUDENT_ID", typeof(int)); - + return ((IObjectContextAdapter)this).ObjectContext.ExecuteFunction("UPCOMING_RIDES_BY_STUDENT_ID", sTUDENT_IDParameter); } - + public virtual int UPDATE_ACT_INFO() { return ((IObjectContextAdapter)this).ObjectContext.ExecuteFunction("UPDATE_ACT_INFO"); } - + public virtual int UPDATE_DESCRIPTION(Nullable iD, string vALUE) { var iDParameter = iD.HasValue ? new ObjectParameter("ID", iD) : new ObjectParameter("ID", typeof(int)); - + var vALUEParameter = vALUE != null ? new ObjectParameter("VALUE", vALUE) : new ObjectParameter("VALUE", typeof(string)); - + return ((IObjectContextAdapter)this).ObjectContext.ExecuteFunction("UPDATE_DESCRIPTION", iDParameter, vALUEParameter); } - + public virtual int UPDATE_MYSCHEDULE(string eVENTID, string gORDONID, string lOCATION, string dESCRIPTION, string mON_CDE, string tUE_CDE, string wED_CDE, string tHU_CDE, string fRI_CDE, string sAT_CDE, string sUN_CDE, Nullable iS_ALLDAY, Nullable bEGINTIME, Nullable eNDTIME) { var eVENTIDParameter = eVENTID != null ? new ObjectParameter("EVENTID", eVENTID) : new ObjectParameter("EVENTID", typeof(string)); - + var gORDONIDParameter = gORDONID != null ? new ObjectParameter("GORDONID", gORDONID) : new ObjectParameter("GORDONID", typeof(string)); - + var lOCATIONParameter = lOCATION != null ? new ObjectParameter("LOCATION", lOCATION) : new ObjectParameter("LOCATION", typeof(string)); - + var dESCRIPTIONParameter = dESCRIPTION != null ? new ObjectParameter("DESCRIPTION", dESCRIPTION) : new ObjectParameter("DESCRIPTION", typeof(string)); - + var mON_CDEParameter = mON_CDE != null ? new ObjectParameter("MON_CDE", mON_CDE) : new ObjectParameter("MON_CDE", typeof(string)); - + var tUE_CDEParameter = tUE_CDE != null ? new ObjectParameter("TUE_CDE", tUE_CDE) : new ObjectParameter("TUE_CDE", typeof(string)); - + var wED_CDEParameter = wED_CDE != null ? new ObjectParameter("WED_CDE", wED_CDE) : new ObjectParameter("WED_CDE", typeof(string)); - + var tHU_CDEParameter = tHU_CDE != null ? new ObjectParameter("THU_CDE", tHU_CDE) : new ObjectParameter("THU_CDE", typeof(string)); - + var fRI_CDEParameter = fRI_CDE != null ? new ObjectParameter("FRI_CDE", fRI_CDE) : new ObjectParameter("FRI_CDE", typeof(string)); - + var sAT_CDEParameter = sAT_CDE != null ? new ObjectParameter("SAT_CDE", sAT_CDE) : new ObjectParameter("SAT_CDE", typeof(string)); - + var sUN_CDEParameter = sUN_CDE != null ? new ObjectParameter("SUN_CDE", sUN_CDE) : new ObjectParameter("SUN_CDE", typeof(string)); - + var iS_ALLDAYParameter = iS_ALLDAY.HasValue ? new ObjectParameter("IS_ALLDAY", iS_ALLDAY) : new ObjectParameter("IS_ALLDAY", typeof(int)); - + var bEGINTIMEParameter = bEGINTIME.HasValue ? new ObjectParameter("BEGINTIME", bEGINTIME) : new ObjectParameter("BEGINTIME", typeof(System.TimeSpan)); - + var eNDTIMEParameter = eNDTIME.HasValue ? new ObjectParameter("ENDTIME", eNDTIME) : new ObjectParameter("ENDTIME", typeof(System.TimeSpan)); - + return ((IObjectContextAdapter)this).ObjectContext.ExecuteFunction("UPDATE_MYSCHEDULE", eVENTIDParameter, gORDONIDParameter, lOCATIONParameter, dESCRIPTIONParameter, mON_CDEParameter, tUE_CDEParameter, wED_CDEParameter, tHU_CDEParameter, fRI_CDEParameter, sAT_CDEParameter, sUN_CDEParameter, iS_ALLDAYParameter, bEGINTIMEParameter, eNDTIMEParameter); } - + public virtual int UPDATE_PHONE_PRIVACY(Nullable iD, string vALUE) { var iDParameter = iD.HasValue ? new ObjectParameter("ID", iD) : new ObjectParameter("ID", typeof(int)); - + var vALUEParameter = vALUE != null ? new ObjectParameter("VALUE", vALUE) : new ObjectParameter("VALUE", typeof(string)); - + return ((IObjectContextAdapter)this).ObjectContext.ExecuteFunction("UPDATE_PHONE_PRIVACY", iDParameter, vALUEParameter); } - + public virtual int UPDATE_PHOTO_PATH(Nullable iD, string fILE_PATH, string fILE_NAME) { var iDParameter = iD.HasValue ? new ObjectParameter("ID", iD) : new ObjectParameter("ID", typeof(int)); - + var fILE_PATHParameter = fILE_PATH != null ? new ObjectParameter("FILE_PATH", fILE_PATH) : new ObjectParameter("FILE_PATH", typeof(string)); - + var fILE_NAMEParameter = fILE_NAME != null ? new ObjectParameter("FILE_NAME", fILE_NAME) : new ObjectParameter("FILE_NAME", typeof(string)); - + return ((IObjectContextAdapter)this).ObjectContext.ExecuteFunction("UPDATE_PHOTO_PATH", iDParameter, fILE_PATHParameter, fILE_NAMEParameter); } - + public virtual int UPDATE_SCHEDULE_PRIVACY(Nullable iD, string vALUE) { var iDParameter = iD.HasValue ? new ObjectParameter("ID", iD) : new ObjectParameter("ID", typeof(int)); - + var vALUEParameter = vALUE != null ? new ObjectParameter("VALUE", vALUE) : new ObjectParameter("VALUE", typeof(string)); - + return ((IObjectContextAdapter)this).ObjectContext.ExecuteFunction("UPDATE_SCHEDULE_PRIVACY", iDParameter, vALUEParameter); } - + public virtual int UPDATE_SHOW_PIC(Nullable aCCOUNT_ID, string vALUE) { var aCCOUNT_IDParameter = aCCOUNT_ID.HasValue ? new ObjectParameter("ACCOUNT_ID", aCCOUNT_ID) : new ObjectParameter("ACCOUNT_ID", typeof(int)); - + var vALUEParameter = vALUE != null ? new ObjectParameter("VALUE", vALUE) : new ObjectParameter("VALUE", typeof(string)); - + return ((IObjectContextAdapter)this).ObjectContext.ExecuteFunction("UPDATE_SHOW_PIC", aCCOUNT_IDParameter, vALUEParameter); } - + public virtual int UPDATE_TIMESTAMP(Nullable iD, Nullable vALUE) { var iDParameter = iD.HasValue ? new ObjectParameter("ID", iD) : new ObjectParameter("ID", typeof(int)); - + var vALUEParameter = vALUE.HasValue ? new ObjectParameter("VALUE", vALUE) : new ObjectParameter("VALUE", typeof(System.DateTime)); - + return ((IObjectContextAdapter)this).ObjectContext.ExecuteFunction("UPDATE_TIMESTAMP", iDParameter, vALUEParameter); } - + public virtual ObjectResult> VALID_DRIVES_BY_ID(string dRIVERID) { var dRIVERIDParameter = dRIVERID != null ? new ObjectParameter("DRIVERID", dRIVERID) : new ObjectParameter("DRIVERID", typeof(string)); - + return ((IObjectContextAdapter)this).ObjectContext.ExecuteFunction>("VALID_DRIVES_BY_ID", dRIVERIDParameter); } - + public virtual ObjectResult VICTORY_PROMISE_BY_STUDENT_ID(Nullable sTUDENT_ID) { var sTUDENT_IDParameter = sTUDENT_ID.HasValue ? new ObjectParameter("STUDENT_ID", sTUDENT_ID) : new ObjectParameter("STUDENT_ID", typeof(int)); - + return ((IObjectContextAdapter)this).ObjectContext.ExecuteFunction("VICTORY_PROMISE_BY_STUDENT_ID", sTUDENT_IDParameter); } } diff --git a/Gordon360/Models/CCT_DB_Models.Designer.cs b/Gordon360/Models/CCT_DB_Models.Designer.cs index 31fd86309..e082bee3d 100644 --- a/Gordon360/Models/CCT_DB_Models.Designer.cs +++ b/Gordon360/Models/CCT_DB_Models.Designer.cs @@ -1,4 +1,4 @@ -// T4 code generation is enabled for model 'C:\Users\Isaac.Bleecker\Desktop\saveAPI2\gordon-360-api\Gordon360\Models\CCT_DB_Models.edmx'. +// T4 code generation is enabled for model 'C:\Users\cct.service.000\Desktop\360ForNews\gordon-360-api\Gordon360\Models\CCT_DB_Models.edmx'. // To enable legacy code generation, change the value of the 'Code Generation Strategy' designer // property to 'Legacy ObjectContext'. This property is available in the Properties Window when the model // is open in the designer. diff --git a/Gordon360/Models/CCT_DB_Models.edmx b/Gordon360/Models/CCT_DB_Models.edmx index 94973c2fe..2f74ad47d 100644 --- a/Gordon360/Models/CCT_DB_Models.edmx +++ b/Gordon360/Models/CCT_DB_Models.edmx @@ -148,6 +148,13 @@ + + + + + + + @@ -622,10 +629,19 @@ warning 6002: The table/view 'CCT.dbo.Student' does not have a primary key defin + + + + + + + + + @@ -713,6 +729,9 @@ warning 6002: The table/view 'CCT.dbo.Student' does not have a primary key defin + + + @@ -774,7 +793,9 @@ warning 6002: The table/view 'CCT.dbo.Student' does not have a primary key defin - + + + @@ -838,6 +859,7 @@ warning 6002: The table/view 'CCT.dbo.Student' does not have a primary key defin + @@ -1298,6 +1320,13 @@ warning 6002: The table/view 'CCT.dbo.Student' does not have a primary key defin + + + + + + + @@ -1729,6 +1758,7 @@ warning 6002: The table/view 'CCT.dbo.Student' does not have a primary key defin + @@ -1769,10 +1799,19 @@ warning 6002: The table/view 'CCT.dbo.Student' does not have a primary key defin + + + + + + + + + @@ -1859,6 +1898,9 @@ warning 6002: The table/view 'CCT.dbo.Student' does not have a primary key defin + + + @@ -1920,7 +1962,9 @@ warning 6002: The table/view 'CCT.dbo.Student' does not have a primary key defin - + + + @@ -2162,6 +2206,37 @@ warning 6002: The table/view 'CCT.dbo.Student' does not have a primary key defin + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -2245,22 +2320,27 @@ warning 6002: The table/view 'CCT.dbo.Student' does not have a primary key defin + - + - + + - + + + + @@ -2426,6 +2506,14 @@ warning 6002: The table/view 'CCT.dbo.Student' does not have a primary key defin + + + + + + + + @@ -2876,6 +2964,7 @@ warning 6002: The table/view 'CCT.dbo.Student' does not have a primary key defin + @@ -2900,6 +2989,7 @@ warning 6002: The table/view 'CCT.dbo.Student' does not have a primary key defin + @@ -3059,6 +3149,49 @@ warning 6002: The table/view 'CCT.dbo.Student' does not have a primary key defin + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -3185,13 +3318,15 @@ warning 6002: The table/view 'CCT.dbo.Student' does not have a primary key defin + - + - + + @@ -3202,9 +3337,12 @@ warning 6002: The table/view 'CCT.dbo.Student' does not have a primary key defin - + + + + @@ -3250,4 +3388,4 @@ warning 6002: The table/view 'CCT.dbo.Student' does not have a primary key defin - + \ No newline at end of file diff --git a/Gordon360/Models/CCT_DB_Models.edmx.diagram b/Gordon360/Models/CCT_DB_Models.edmx.diagram index 7d8aaedfc..c4536dc0c 100644 --- a/Gordon360/Models/CCT_DB_Models.edmx.diagram +++ b/Gordon360/Models/CCT_DB_Models.edmx.diagram @@ -4,7 +4,7 @@ - + @@ -16,26 +16,27 @@ - + + - + - - - + + + - - - - - - + + + + + + diff --git a/Gordon360/Models/ChapelSummary.cs b/Gordon360/Models/ChapelSummary.cs new file mode 100644 index 000000000..f86d22716 --- /dev/null +++ b/Gordon360/Models/ChapelSummary.cs @@ -0,0 +1,41 @@ +//------------------------------------------------------------------------------ +// +// This code was generated from a template. +// +// Manual changes to this file may cause unexpected behavior in your application. +// Manual changes to this file will be overwritten if the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace Gordon360.Models +{ + using System; + using System.Collections.Generic; + + public partial class ChapelSummary + { + public int ID { get; set; } + public string TermCD { get; set; } + public string BarCode { get; set; } + public string Name { get; set; } + public string Class { get; set; } + public Nullable Exception { get; set; } + public string Married { get; set; } + public Nullable CreditHrs { get; set; } + public string GEO { get; set; } + public string Commuter { get; set; } + public string GradFlag { get; set; } + public Nullable Required { get; set; } + public Nullable Attended { get; set; } + public Nullable DeferredDate { get; set; } + public Nullable WithdrawnDate { get; set; } + public Nullable GraduatedDate { get; set; } + public Nullable UpdatedDate { get; set; } + public string Waived { get; set; } + public string WaivedBy { get; set; } + public Nullable WaivedDate { get; set; } + public string Basis { get; set; } + public string Defaulted { get; set; } + public string Status { get; set; } + } +} diff --git a/Gordon360/Models/Dining_Meal_Plan_Id_Mapping.cs b/Gordon360/Models/Dining_Meal_Plan_Id_Mapping.cs index f1567b749..82204713b 100644 --- a/Gordon360/Models/Dining_Meal_Plan_Id_Mapping.cs +++ b/Gordon360/Models/Dining_Meal_Plan_Id_Mapping.cs @@ -11,10 +11,10 @@ namespace Gordon360.Models { using System; using System.Collections.Generic; - + public partial class Dining_Meal_Plan_Id_Mapping { public string meal_plan_id { get; set; } public string meal_choice_id { get; set; } } -} \ No newline at end of file +} diff --git a/Gordon360/Models/Dining_Mealplans.cs b/Gordon360/Models/Dining_Mealplans.cs index 84478fe7c..64c30f235 100644 --- a/Gordon360/Models/Dining_Mealplans.cs +++ b/Gordon360/Models/Dining_Mealplans.cs @@ -11,7 +11,7 @@ namespace Gordon360.Models { using System; using System.Collections.Generic; - + public partial class Dining_Mealplans { public string Meal_Plan_Description { get; set; } @@ -19,4 +19,4 @@ public partial class Dining_Mealplans public string Meal_Plan_ID { get; set; } public Nullable Meal_Plan_Initial_Balance { get; set; } } -} \ No newline at end of file +} diff --git a/Gordon360/Models/MyGordon_DB_Models.Context.cs b/Gordon360/Models/MyGordon_DB_Models.Context.cs new file mode 100644 index 000000000..d85c92cd3 --- /dev/null +++ b/Gordon360/Models/MyGordon_DB_Models.Context.cs @@ -0,0 +1,653 @@ +//------------------------------------------------------------------------------ +// +// This code was generated from a template. +// +// Manual changes to this file may cause unexpected behavior in your application. +// Manual changes to this file will be overwritten if the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace Gordon360.Models +{ + using System; + using System.Data.Entity; + using System.Data.Entity.Infrastructure; + using System.Data.Entity.Core.Objects; + using System.Linq; + + public partial class MyGordonEntities : DbContext + { + public MyGordonEntities() + : base("name=MyGordonEntities") + { + } + + protected override void OnModelCreating(DbModelBuilder modelBuilder) + { + throw new UnintentionalCodeFirstException(); + } + + public virtual DbSet ChapelSummary { get; set; } + public virtual DbSet dtproperties { get; set; } + public virtual DbSet StudentNews { get; set; } + public virtual DbSet StudentNewsCategory { get; set; } + public virtual DbSet Countries { get; set; } + public virtual DbSet view_cct_alumni { get; set; } + public virtual DbSet view_cct_ChapelEvent { get; set; } + public virtual DbSet view_cct_facstaff { get; set; } + public virtual DbSet view_cct_student { get; set; } + + public virtual int dt_addtosourcecontrol(string vchSourceSafeINI, string vchProjectName, string vchComment, string vchLoginName, string vchPassword) + { + var vchSourceSafeINIParameter = vchSourceSafeINI != null ? + new ObjectParameter("vchSourceSafeINI", vchSourceSafeINI) : + new ObjectParameter("vchSourceSafeINI", typeof(string)); + + var vchProjectNameParameter = vchProjectName != null ? + new ObjectParameter("vchProjectName", vchProjectName) : + new ObjectParameter("vchProjectName", typeof(string)); + + var vchCommentParameter = vchComment != null ? + new ObjectParameter("vchComment", vchComment) : + new ObjectParameter("vchComment", typeof(string)); + + var vchLoginNameParameter = vchLoginName != null ? + new ObjectParameter("vchLoginName", vchLoginName) : + new ObjectParameter("vchLoginName", typeof(string)); + + var vchPasswordParameter = vchPassword != null ? + new ObjectParameter("vchPassword", vchPassword) : + new ObjectParameter("vchPassword", typeof(string)); + + return ((IObjectContextAdapter)this).ObjectContext.ExecuteFunction("dt_addtosourcecontrol", vchSourceSafeINIParameter, vchProjectNameParameter, vchCommentParameter, vchLoginNameParameter, vchPasswordParameter); + } + + public virtual int dt_addtosourcecontrol_u(string vchSourceSafeINI, string vchProjectName, string vchComment, string vchLoginName, string vchPassword) + { + var vchSourceSafeINIParameter = vchSourceSafeINI != null ? + new ObjectParameter("vchSourceSafeINI", vchSourceSafeINI) : + new ObjectParameter("vchSourceSafeINI", typeof(string)); + + var vchProjectNameParameter = vchProjectName != null ? + new ObjectParameter("vchProjectName", vchProjectName) : + new ObjectParameter("vchProjectName", typeof(string)); + + var vchCommentParameter = vchComment != null ? + new ObjectParameter("vchComment", vchComment) : + new ObjectParameter("vchComment", typeof(string)); + + var vchLoginNameParameter = vchLoginName != null ? + new ObjectParameter("vchLoginName", vchLoginName) : + new ObjectParameter("vchLoginName", typeof(string)); + + var vchPasswordParameter = vchPassword != null ? + new ObjectParameter("vchPassword", vchPassword) : + new ObjectParameter("vchPassword", typeof(string)); + + return ((IObjectContextAdapter)this).ObjectContext.ExecuteFunction("dt_addtosourcecontrol_u", vchSourceSafeINIParameter, vchProjectNameParameter, vchCommentParameter, vchLoginNameParameter, vchPasswordParameter); + } + + public virtual int dt_adduserobject() + { + return ((IObjectContextAdapter)this).ObjectContext.ExecuteFunction("dt_adduserobject"); + } + + public virtual int dt_adduserobject_vcs(string vchProperty) + { + var vchPropertyParameter = vchProperty != null ? + new ObjectParameter("vchProperty", vchProperty) : + new ObjectParameter("vchProperty", typeof(string)); + + return ((IObjectContextAdapter)this).ObjectContext.ExecuteFunction("dt_adduserobject_vcs", vchPropertyParameter); + } + + public virtual int dt_checkinobject(string chObjectType, string vchObjectName, string vchComment, string vchLoginName, string vchPassword, Nullable iVCSFlags, Nullable iActionFlag, string txStream1, string txStream2, string txStream3) + { + var chObjectTypeParameter = chObjectType != null ? + new ObjectParameter("chObjectType", chObjectType) : + new ObjectParameter("chObjectType", typeof(string)); + + var vchObjectNameParameter = vchObjectName != null ? + new ObjectParameter("vchObjectName", vchObjectName) : + new ObjectParameter("vchObjectName", typeof(string)); + + var vchCommentParameter = vchComment != null ? + new ObjectParameter("vchComment", vchComment) : + new ObjectParameter("vchComment", typeof(string)); + + var vchLoginNameParameter = vchLoginName != null ? + new ObjectParameter("vchLoginName", vchLoginName) : + new ObjectParameter("vchLoginName", typeof(string)); + + var vchPasswordParameter = vchPassword != null ? + new ObjectParameter("vchPassword", vchPassword) : + new ObjectParameter("vchPassword", typeof(string)); + + var iVCSFlagsParameter = iVCSFlags.HasValue ? + new ObjectParameter("iVCSFlags", iVCSFlags) : + new ObjectParameter("iVCSFlags", typeof(int)); + + var iActionFlagParameter = iActionFlag.HasValue ? + new ObjectParameter("iActionFlag", iActionFlag) : + new ObjectParameter("iActionFlag", typeof(int)); + + var txStream1Parameter = txStream1 != null ? + new ObjectParameter("txStream1", txStream1) : + new ObjectParameter("txStream1", typeof(string)); + + var txStream2Parameter = txStream2 != null ? + new ObjectParameter("txStream2", txStream2) : + new ObjectParameter("txStream2", typeof(string)); + + var txStream3Parameter = txStream3 != null ? + new ObjectParameter("txStream3", txStream3) : + new ObjectParameter("txStream3", typeof(string)); + + return ((IObjectContextAdapter)this).ObjectContext.ExecuteFunction("dt_checkinobject", chObjectTypeParameter, vchObjectNameParameter, vchCommentParameter, vchLoginNameParameter, vchPasswordParameter, iVCSFlagsParameter, iActionFlagParameter, txStream1Parameter, txStream2Parameter, txStream3Parameter); + } + + public virtual int dt_checkinobject_u(string chObjectType, string vchObjectName, string vchComment, string vchLoginName, string vchPassword, Nullable iVCSFlags, Nullable iActionFlag, string txStream1, string txStream2, string txStream3) + { + var chObjectTypeParameter = chObjectType != null ? + new ObjectParameter("chObjectType", chObjectType) : + new ObjectParameter("chObjectType", typeof(string)); + + var vchObjectNameParameter = vchObjectName != null ? + new ObjectParameter("vchObjectName", vchObjectName) : + new ObjectParameter("vchObjectName", typeof(string)); + + var vchCommentParameter = vchComment != null ? + new ObjectParameter("vchComment", vchComment) : + new ObjectParameter("vchComment", typeof(string)); + + var vchLoginNameParameter = vchLoginName != null ? + new ObjectParameter("vchLoginName", vchLoginName) : + new ObjectParameter("vchLoginName", typeof(string)); + + var vchPasswordParameter = vchPassword != null ? + new ObjectParameter("vchPassword", vchPassword) : + new ObjectParameter("vchPassword", typeof(string)); + + var iVCSFlagsParameter = iVCSFlags.HasValue ? + new ObjectParameter("iVCSFlags", iVCSFlags) : + new ObjectParameter("iVCSFlags", typeof(int)); + + var iActionFlagParameter = iActionFlag.HasValue ? + new ObjectParameter("iActionFlag", iActionFlag) : + new ObjectParameter("iActionFlag", typeof(int)); + + var txStream1Parameter = txStream1 != null ? + new ObjectParameter("txStream1", txStream1) : + new ObjectParameter("txStream1", typeof(string)); + + var txStream2Parameter = txStream2 != null ? + new ObjectParameter("txStream2", txStream2) : + new ObjectParameter("txStream2", typeof(string)); + + var txStream3Parameter = txStream3 != null ? + new ObjectParameter("txStream3", txStream3) : + new ObjectParameter("txStream3", typeof(string)); + + return ((IObjectContextAdapter)this).ObjectContext.ExecuteFunction("dt_checkinobject_u", chObjectTypeParameter, vchObjectNameParameter, vchCommentParameter, vchLoginNameParameter, vchPasswordParameter, iVCSFlagsParameter, iActionFlagParameter, txStream1Parameter, txStream2Parameter, txStream3Parameter); + } + + public virtual int dt_checkoutobject(string chObjectType, string vchObjectName, string vchComment, string vchLoginName, string vchPassword, Nullable iVCSFlags, Nullable iActionFlag) + { + var chObjectTypeParameter = chObjectType != null ? + new ObjectParameter("chObjectType", chObjectType) : + new ObjectParameter("chObjectType", typeof(string)); + + var vchObjectNameParameter = vchObjectName != null ? + new ObjectParameter("vchObjectName", vchObjectName) : + new ObjectParameter("vchObjectName", typeof(string)); + + var vchCommentParameter = vchComment != null ? + new ObjectParameter("vchComment", vchComment) : + new ObjectParameter("vchComment", typeof(string)); + + var vchLoginNameParameter = vchLoginName != null ? + new ObjectParameter("vchLoginName", vchLoginName) : + new ObjectParameter("vchLoginName", typeof(string)); + + var vchPasswordParameter = vchPassword != null ? + new ObjectParameter("vchPassword", vchPassword) : + new ObjectParameter("vchPassword", typeof(string)); + + var iVCSFlagsParameter = iVCSFlags.HasValue ? + new ObjectParameter("iVCSFlags", iVCSFlags) : + new ObjectParameter("iVCSFlags", typeof(int)); + + var iActionFlagParameter = iActionFlag.HasValue ? + new ObjectParameter("iActionFlag", iActionFlag) : + new ObjectParameter("iActionFlag", typeof(int)); + + return ((IObjectContextAdapter)this).ObjectContext.ExecuteFunction("dt_checkoutobject", chObjectTypeParameter, vchObjectNameParameter, vchCommentParameter, vchLoginNameParameter, vchPasswordParameter, iVCSFlagsParameter, iActionFlagParameter); + } + + public virtual int dt_checkoutobject_u(string chObjectType, string vchObjectName, string vchComment, string vchLoginName, string vchPassword, Nullable iVCSFlags, Nullable iActionFlag) + { + var chObjectTypeParameter = chObjectType != null ? + new ObjectParameter("chObjectType", chObjectType) : + new ObjectParameter("chObjectType", typeof(string)); + + var vchObjectNameParameter = vchObjectName != null ? + new ObjectParameter("vchObjectName", vchObjectName) : + new ObjectParameter("vchObjectName", typeof(string)); + + var vchCommentParameter = vchComment != null ? + new ObjectParameter("vchComment", vchComment) : + new ObjectParameter("vchComment", typeof(string)); + + var vchLoginNameParameter = vchLoginName != null ? + new ObjectParameter("vchLoginName", vchLoginName) : + new ObjectParameter("vchLoginName", typeof(string)); + + var vchPasswordParameter = vchPassword != null ? + new ObjectParameter("vchPassword", vchPassword) : + new ObjectParameter("vchPassword", typeof(string)); + + var iVCSFlagsParameter = iVCSFlags.HasValue ? + new ObjectParameter("iVCSFlags", iVCSFlags) : + new ObjectParameter("iVCSFlags", typeof(int)); + + var iActionFlagParameter = iActionFlag.HasValue ? + new ObjectParameter("iActionFlag", iActionFlag) : + new ObjectParameter("iActionFlag", typeof(int)); + + return ((IObjectContextAdapter)this).ObjectContext.ExecuteFunction("dt_checkoutobject_u", chObjectTypeParameter, vchObjectNameParameter, vchCommentParameter, vchLoginNameParameter, vchPasswordParameter, iVCSFlagsParameter, iActionFlagParameter); + } + + public virtual int dt_displayoaerror(Nullable iObject, Nullable iresult) + { + var iObjectParameter = iObject.HasValue ? + new ObjectParameter("iObject", iObject) : + new ObjectParameter("iObject", typeof(int)); + + var iresultParameter = iresult.HasValue ? + new ObjectParameter("iresult", iresult) : + new ObjectParameter("iresult", typeof(int)); + + return ((IObjectContextAdapter)this).ObjectContext.ExecuteFunction("dt_displayoaerror", iObjectParameter, iresultParameter); + } + + public virtual int dt_displayoaerror_u(Nullable iObject, Nullable iresult) + { + var iObjectParameter = iObject.HasValue ? + new ObjectParameter("iObject", iObject) : + new ObjectParameter("iObject", typeof(int)); + + var iresultParameter = iresult.HasValue ? + new ObjectParameter("iresult", iresult) : + new ObjectParameter("iresult", typeof(int)); + + return ((IObjectContextAdapter)this).ObjectContext.ExecuteFunction("dt_displayoaerror_u", iObjectParameter, iresultParameter); + } + + public virtual int dt_droppropertiesbyid(Nullable id, string property) + { + var idParameter = id.HasValue ? + new ObjectParameter("id", id) : + new ObjectParameter("id", typeof(int)); + + var propertyParameter = property != null ? + new ObjectParameter("property", property) : + new ObjectParameter("property", typeof(string)); + + return ((IObjectContextAdapter)this).ObjectContext.ExecuteFunction("dt_droppropertiesbyid", idParameter, propertyParameter); + } + + public virtual int dt_dropuserobjectbyid(Nullable id) + { + var idParameter = id.HasValue ? + new ObjectParameter("id", id) : + new ObjectParameter("id", typeof(int)); + + return ((IObjectContextAdapter)this).ObjectContext.ExecuteFunction("dt_dropuserobjectbyid", idParameter); + } + + public virtual int dt_generateansiname(ObjectParameter name) + { + return ((IObjectContextAdapter)this).ObjectContext.ExecuteFunction("dt_generateansiname", name); + } + + public virtual ObjectResult> dt_getobjwithprop(string property, string value) + { + var propertyParameter = property != null ? + new ObjectParameter("property", property) : + new ObjectParameter("property", typeof(string)); + + var valueParameter = value != null ? + new ObjectParameter("value", value) : + new ObjectParameter("value", typeof(string)); + + return ((IObjectContextAdapter)this).ObjectContext.ExecuteFunction>("dt_getobjwithprop", propertyParameter, valueParameter); + } + + public virtual ObjectResult> dt_getobjwithprop_u(string property, string uvalue) + { + var propertyParameter = property != null ? + new ObjectParameter("property", property) : + new ObjectParameter("property", typeof(string)); + + var uvalueParameter = uvalue != null ? + new ObjectParameter("uvalue", uvalue) : + new ObjectParameter("uvalue", typeof(string)); + + return ((IObjectContextAdapter)this).ObjectContext.ExecuteFunction>("dt_getobjwithprop_u", propertyParameter, uvalueParameter); + } + + public virtual ObjectResult dt_getpropertiesbyid(Nullable id, string property) + { + var idParameter = id.HasValue ? + new ObjectParameter("id", id) : + new ObjectParameter("id", typeof(int)); + + var propertyParameter = property != null ? + new ObjectParameter("property", property) : + new ObjectParameter("property", typeof(string)); + + return ((IObjectContextAdapter)this).ObjectContext.ExecuteFunction("dt_getpropertiesbyid", idParameter, propertyParameter); + } + + public virtual ObjectResult dt_getpropertiesbyid_u(Nullable id, string property) + { + var idParameter = id.HasValue ? + new ObjectParameter("id", id) : + new ObjectParameter("id", typeof(int)); + + var propertyParameter = property != null ? + new ObjectParameter("property", property) : + new ObjectParameter("property", typeof(string)); + + return ((IObjectContextAdapter)this).ObjectContext.ExecuteFunction("dt_getpropertiesbyid_u", idParameter, propertyParameter); + } + + public virtual int dt_getpropertiesbyid_vcs(Nullable id, string property, ObjectParameter value) + { + var idParameter = id.HasValue ? + new ObjectParameter("id", id) : + new ObjectParameter("id", typeof(int)); + + var propertyParameter = property != null ? + new ObjectParameter("property", property) : + new ObjectParameter("property", typeof(string)); + + return ((IObjectContextAdapter)this).ObjectContext.ExecuteFunction("dt_getpropertiesbyid_vcs", idParameter, propertyParameter, value); + } + + public virtual int dt_getpropertiesbyid_vcs_u(Nullable id, string property, ObjectParameter value) + { + var idParameter = id.HasValue ? + new ObjectParameter("id", id) : + new ObjectParameter("id", typeof(int)); + + var propertyParameter = property != null ? + new ObjectParameter("property", property) : + new ObjectParameter("property", typeof(string)); + + return ((IObjectContextAdapter)this).ObjectContext.ExecuteFunction("dt_getpropertiesbyid_vcs_u", idParameter, propertyParameter, value); + } + + public virtual int dt_isundersourcecontrol(string vchLoginName, string vchPassword, Nullable iWhoToo) + { + var vchLoginNameParameter = vchLoginName != null ? + new ObjectParameter("vchLoginName", vchLoginName) : + new ObjectParameter("vchLoginName", typeof(string)); + + var vchPasswordParameter = vchPassword != null ? + new ObjectParameter("vchPassword", vchPassword) : + new ObjectParameter("vchPassword", typeof(string)); + + var iWhoTooParameter = iWhoToo.HasValue ? + new ObjectParameter("iWhoToo", iWhoToo) : + new ObjectParameter("iWhoToo", typeof(int)); + + return ((IObjectContextAdapter)this).ObjectContext.ExecuteFunction("dt_isundersourcecontrol", vchLoginNameParameter, vchPasswordParameter, iWhoTooParameter); + } + + public virtual int dt_isundersourcecontrol_u(string vchLoginName, string vchPassword, Nullable iWhoToo) + { + var vchLoginNameParameter = vchLoginName != null ? + new ObjectParameter("vchLoginName", vchLoginName) : + new ObjectParameter("vchLoginName", typeof(string)); + + var vchPasswordParameter = vchPassword != null ? + new ObjectParameter("vchPassword", vchPassword) : + new ObjectParameter("vchPassword", typeof(string)); + + var iWhoTooParameter = iWhoToo.HasValue ? + new ObjectParameter("iWhoToo", iWhoToo) : + new ObjectParameter("iWhoToo", typeof(int)); + + return ((IObjectContextAdapter)this).ObjectContext.ExecuteFunction("dt_isundersourcecontrol_u", vchLoginNameParameter, vchPasswordParameter, iWhoTooParameter); + } + + public virtual int dt_removefromsourcecontrol() + { + return ((IObjectContextAdapter)this).ObjectContext.ExecuteFunction("dt_removefromsourcecontrol"); + } + + public virtual int dt_setpropertybyid(Nullable id, string property, string value, byte[] lvalue) + { + var idParameter = id.HasValue ? + new ObjectParameter("id", id) : + new ObjectParameter("id", typeof(int)); + + var propertyParameter = property != null ? + new ObjectParameter("property", property) : + new ObjectParameter("property", typeof(string)); + + var valueParameter = value != null ? + new ObjectParameter("value", value) : + new ObjectParameter("value", typeof(string)); + + var lvalueParameter = lvalue != null ? + new ObjectParameter("lvalue", lvalue) : + new ObjectParameter("lvalue", typeof(byte[])); + + return ((IObjectContextAdapter)this).ObjectContext.ExecuteFunction("dt_setpropertybyid", idParameter, propertyParameter, valueParameter, lvalueParameter); + } + + public virtual int dt_setpropertybyid_u(Nullable id, string property, string uvalue, byte[] lvalue) + { + var idParameter = id.HasValue ? + new ObjectParameter("id", id) : + new ObjectParameter("id", typeof(int)); + + var propertyParameter = property != null ? + new ObjectParameter("property", property) : + new ObjectParameter("property", typeof(string)); + + var uvalueParameter = uvalue != null ? + new ObjectParameter("uvalue", uvalue) : + new ObjectParameter("uvalue", typeof(string)); + + var lvalueParameter = lvalue != null ? + new ObjectParameter("lvalue", lvalue) : + new ObjectParameter("lvalue", typeof(byte[])); + + return ((IObjectContextAdapter)this).ObjectContext.ExecuteFunction("dt_setpropertybyid_u", idParameter, propertyParameter, uvalueParameter, lvalueParameter); + } + + public virtual int dt_validateloginparams(string vchLoginName, string vchPassword) + { + var vchLoginNameParameter = vchLoginName != null ? + new ObjectParameter("vchLoginName", vchLoginName) : + new ObjectParameter("vchLoginName", typeof(string)); + + var vchPasswordParameter = vchPassword != null ? + new ObjectParameter("vchPassword", vchPassword) : + new ObjectParameter("vchPassword", typeof(string)); + + return ((IObjectContextAdapter)this).ObjectContext.ExecuteFunction("dt_validateloginparams", vchLoginNameParameter, vchPasswordParameter); + } + + public virtual int dt_validateloginparams_u(string vchLoginName, string vchPassword) + { + var vchLoginNameParameter = vchLoginName != null ? + new ObjectParameter("vchLoginName", vchLoginName) : + new ObjectParameter("vchLoginName", typeof(string)); + + var vchPasswordParameter = vchPassword != null ? + new ObjectParameter("vchPassword", vchPassword) : + new ObjectParameter("vchPassword", typeof(string)); + + return ((IObjectContextAdapter)this).ObjectContext.ExecuteFunction("dt_validateloginparams_u", vchLoginNameParameter, vchPasswordParameter); + } + + public virtual int dt_vcsenabled() + { + return ((IObjectContextAdapter)this).ObjectContext.ExecuteFunction("dt_vcsenabled"); + } + + public virtual ObjectResult> dt_verstamp006() + { + return ((IObjectContextAdapter)this).ObjectContext.ExecuteFunction>("dt_verstamp006"); + } + + public virtual ObjectResult> dt_verstamp007() + { + return ((IObjectContextAdapter)this).ObjectContext.ExecuteFunction>("dt_verstamp007"); + } + + public virtual int dt_whocheckedout(string chObjectType, string vchObjectName, string vchLoginName, string vchPassword) + { + var chObjectTypeParameter = chObjectType != null ? + new ObjectParameter("chObjectType", chObjectType) : + new ObjectParameter("chObjectType", typeof(string)); + + var vchObjectNameParameter = vchObjectName != null ? + new ObjectParameter("vchObjectName", vchObjectName) : + new ObjectParameter("vchObjectName", typeof(string)); + + var vchLoginNameParameter = vchLoginName != null ? + new ObjectParameter("vchLoginName", vchLoginName) : + new ObjectParameter("vchLoginName", typeof(string)); + + var vchPasswordParameter = vchPassword != null ? + new ObjectParameter("vchPassword", vchPassword) : + new ObjectParameter("vchPassword", typeof(string)); + + return ((IObjectContextAdapter)this).ObjectContext.ExecuteFunction("dt_whocheckedout", chObjectTypeParameter, vchObjectNameParameter, vchLoginNameParameter, vchPasswordParameter); + } + + public virtual int dt_whocheckedout_u(string chObjectType, string vchObjectName, string vchLoginName, string vchPassword) + { + var chObjectTypeParameter = chObjectType != null ? + new ObjectParameter("chObjectType", chObjectType) : + new ObjectParameter("chObjectType", typeof(string)); + + var vchObjectNameParameter = vchObjectName != null ? + new ObjectParameter("vchObjectName", vchObjectName) : + new ObjectParameter("vchObjectName", typeof(string)); + + var vchLoginNameParameter = vchLoginName != null ? + new ObjectParameter("vchLoginName", vchLoginName) : + new ObjectParameter("vchLoginName", typeof(string)); + + var vchPasswordParameter = vchPassword != null ? + new ObjectParameter("vchPassword", vchPassword) : + new ObjectParameter("vchPassword", typeof(string)); + + return ((IObjectContextAdapter)this).ObjectContext.ExecuteFunction("dt_whocheckedout_u", chObjectTypeParameter, vchObjectNameParameter, vchLoginNameParameter, vchPasswordParameter); + } + + public virtual int sp_alterdiagram(string diagramname, Nullable owner_id, Nullable version, byte[] definition) + { + var diagramnameParameter = diagramname != null ? + new ObjectParameter("diagramname", diagramname) : + new ObjectParameter("diagramname", typeof(string)); + + var owner_idParameter = owner_id.HasValue ? + new ObjectParameter("owner_id", owner_id) : + new ObjectParameter("owner_id", typeof(int)); + + var versionParameter = version.HasValue ? + new ObjectParameter("version", version) : + new ObjectParameter("version", typeof(int)); + + var definitionParameter = definition != null ? + new ObjectParameter("definition", definition) : + new ObjectParameter("definition", typeof(byte[])); + + return ((IObjectContextAdapter)this).ObjectContext.ExecuteFunction("sp_alterdiagram", diagramnameParameter, owner_idParameter, versionParameter, definitionParameter); + } + + public virtual int sp_creatediagram(string diagramname, Nullable owner_id, Nullable version, byte[] definition) + { + var diagramnameParameter = diagramname != null ? + new ObjectParameter("diagramname", diagramname) : + new ObjectParameter("diagramname", typeof(string)); + + var owner_idParameter = owner_id.HasValue ? + new ObjectParameter("owner_id", owner_id) : + new ObjectParameter("owner_id", typeof(int)); + + var versionParameter = version.HasValue ? + new ObjectParameter("version", version) : + new ObjectParameter("version", typeof(int)); + + var definitionParameter = definition != null ? + new ObjectParameter("definition", definition) : + new ObjectParameter("definition", typeof(byte[])); + + return ((IObjectContextAdapter)this).ObjectContext.ExecuteFunction("sp_creatediagram", diagramnameParameter, owner_idParameter, versionParameter, definitionParameter); + } + + public virtual int sp_dropdiagram(string diagramname, Nullable owner_id) + { + var diagramnameParameter = diagramname != null ? + new ObjectParameter("diagramname", diagramname) : + new ObjectParameter("diagramname", typeof(string)); + + var owner_idParameter = owner_id.HasValue ? + new ObjectParameter("owner_id", owner_id) : + new ObjectParameter("owner_id", typeof(int)); + + return ((IObjectContextAdapter)this).ObjectContext.ExecuteFunction("sp_dropdiagram", diagramnameParameter, owner_idParameter); + } + + public virtual ObjectResult sp_helpdiagramdefinition(string diagramname, Nullable owner_id) + { + var diagramnameParameter = diagramname != null ? + new ObjectParameter("diagramname", diagramname) : + new ObjectParameter("diagramname", typeof(string)); + + var owner_idParameter = owner_id.HasValue ? + new ObjectParameter("owner_id", owner_id) : + new ObjectParameter("owner_id", typeof(int)); + + return ((IObjectContextAdapter)this).ObjectContext.ExecuteFunction("sp_helpdiagramdefinition", diagramnameParameter, owner_idParameter); + } + + public virtual ObjectResult sp_helpdiagrams(string diagramname, Nullable owner_id) + { + var diagramnameParameter = diagramname != null ? + new ObjectParameter("diagramname", diagramname) : + new ObjectParameter("diagramname", typeof(string)); + + var owner_idParameter = owner_id.HasValue ? + new ObjectParameter("owner_id", owner_id) : + new ObjectParameter("owner_id", typeof(int)); + + return ((IObjectContextAdapter)this).ObjectContext.ExecuteFunction("sp_helpdiagrams", diagramnameParameter, owner_idParameter); + } + + public virtual int sp_renamediagram(string diagramname, Nullable owner_id, string new_diagramname) + { + var diagramnameParameter = diagramname != null ? + new ObjectParameter("diagramname", diagramname) : + new ObjectParameter("diagramname", typeof(string)); + + var owner_idParameter = owner_id.HasValue ? + new ObjectParameter("owner_id", owner_id) : + new ObjectParameter("owner_id", typeof(int)); + + var new_diagramnameParameter = new_diagramname != null ? + new ObjectParameter("new_diagramname", new_diagramname) : + new ObjectParameter("new_diagramname", typeof(string)); + + return ((IObjectContextAdapter)this).ObjectContext.ExecuteFunction("sp_renamediagram", diagramnameParameter, owner_idParameter, new_diagramnameParameter); + } + } +} diff --git a/Gordon360/Models/MyGordon_DB_Models.Context.tt b/Gordon360/Models/MyGordon_DB_Models.Context.tt new file mode 100644 index 000000000..69cbbba37 --- /dev/null +++ b/Gordon360/Models/MyGordon_DB_Models.Context.tt @@ -0,0 +1,636 @@ +<#@ template language="C#" debug="false" hostspecific="true"#> +<#@ include file="EF6.Utility.CS.ttinclude"#><#@ + output extension=".cs"#><# + +const string inputFile = @"MyGordon_DB_Models.edmx"; +var textTransform = DynamicTextTransformation.Create(this); +var code = new CodeGenerationTools(this); +var ef = new MetadataTools(this); +var typeMapper = new TypeMapper(code, ef, textTransform.Errors); +var loader = new EdmMetadataLoader(textTransform.Host, textTransform.Errors); +var itemCollection = loader.CreateEdmItemCollection(inputFile); +var modelNamespace = loader.GetModelNamespace(inputFile); +var codeStringGenerator = new CodeStringGenerator(code, typeMapper, ef); + +var container = itemCollection.OfType().FirstOrDefault(); +if (container == null) +{ + return string.Empty; +} +#> +//------------------------------------------------------------------------------ +// +// <#=CodeGenerationTools.GetResourceString("Template_GeneratedCodeCommentLine1")#> +// +// <#=CodeGenerationTools.GetResourceString("Template_GeneratedCodeCommentLine2")#> +// <#=CodeGenerationTools.GetResourceString("Template_GeneratedCodeCommentLine3")#> +// +//------------------------------------------------------------------------------ + +<# + +var codeNamespace = code.VsNamespaceSuggestion(); +if (!String.IsNullOrEmpty(codeNamespace)) +{ +#> +namespace <#=code.EscapeNamespace(codeNamespace)#> +{ +<# + PushIndent(" "); +} + +#> +using System; +using System.Data.Entity; +using System.Data.Entity.Infrastructure; +<# +if (container.FunctionImports.Any()) +{ +#> +using System.Data.Entity.Core.Objects; +using System.Linq; +<# +} +#> + +<#=Accessibility.ForType(container)#> partial class <#=code.Escape(container)#> : DbContext +{ + public <#=code.Escape(container)#>() + : base("name=<#=container.Name#>") + { +<# +if (!loader.IsLazyLoadingEnabled(container)) +{ +#> + this.Configuration.LazyLoadingEnabled = false; +<# +} + +foreach (var entitySet in container.BaseEntitySets.OfType()) +{ + // Note: the DbSet members are defined below such that the getter and + // setter always have the same accessibility as the DbSet definition + if (Accessibility.ForReadOnlyProperty(entitySet) != "public") + { +#> + <#=codeStringGenerator.DbSetInitializer(entitySet)#> +<# + } +} +#> + } + + protected override void OnModelCreating(DbModelBuilder modelBuilder) + { + throw new UnintentionalCodeFirstException(); + } + +<# + foreach (var entitySet in container.BaseEntitySets.OfType()) + { +#> + <#=codeStringGenerator.DbSet(entitySet)#> +<# + } + + foreach (var edmFunction in container.FunctionImports) + { + WriteFunctionImport(typeMapper, codeStringGenerator, edmFunction, modelNamespace, includeMergeOption: false); + } +#> +} +<# + +if (!String.IsNullOrEmpty(codeNamespace)) +{ + PopIndent(); +#> +} +<# +} +#> +<#+ + +private void WriteFunctionImport(TypeMapper typeMapper, CodeStringGenerator codeStringGenerator, EdmFunction edmFunction, string modelNamespace, bool includeMergeOption) +{ + if (typeMapper.IsComposable(edmFunction)) + { +#> + + [DbFunction("<#=edmFunction.NamespaceName#>", "<#=edmFunction.Name#>")] + <#=codeStringGenerator.ComposableFunctionMethod(edmFunction, modelNamespace)#> + { +<#+ + codeStringGenerator.WriteFunctionParameters(edmFunction, WriteFunctionParameter); +#> + <#=codeStringGenerator.ComposableCreateQuery(edmFunction, modelNamespace)#> + } +<#+ + } + else + { +#> + + <#=codeStringGenerator.FunctionMethod(edmFunction, modelNamespace, includeMergeOption)#> + { +<#+ + codeStringGenerator.WriteFunctionParameters(edmFunction, WriteFunctionParameter); +#> + <#=codeStringGenerator.ExecuteFunction(edmFunction, modelNamespace, includeMergeOption)#> + } +<#+ + if (typeMapper.GenerateMergeOptionFunction(edmFunction, includeMergeOption)) + { + WriteFunctionImport(typeMapper, codeStringGenerator, edmFunction, modelNamespace, includeMergeOption: true); + } + } +} + +public void WriteFunctionParameter(string name, string isNotNull, string notNullInit, string nullInit) +{ +#> + var <#=name#> = <#=isNotNull#> ? + <#=notNullInit#> : + <#=nullInit#>; + +<#+ +} + +public const string TemplateId = "CSharp_DbContext_Context_EF6"; + +public class CodeStringGenerator +{ + private readonly CodeGenerationTools _code; + private readonly TypeMapper _typeMapper; + private readonly MetadataTools _ef; + + public CodeStringGenerator(CodeGenerationTools code, TypeMapper typeMapper, MetadataTools ef) + { + ArgumentNotNull(code, "code"); + ArgumentNotNull(typeMapper, "typeMapper"); + ArgumentNotNull(ef, "ef"); + + _code = code; + _typeMapper = typeMapper; + _ef = ef; + } + + public string Property(EdmProperty edmProperty) + { + return string.Format( + CultureInfo.InvariantCulture, + "{0} {1} {2} {{ {3}get; {4}set; }}", + Accessibility.ForProperty(edmProperty), + _typeMapper.GetTypeName(edmProperty.TypeUsage), + _code.Escape(edmProperty), + _code.SpaceAfter(Accessibility.ForGetter(edmProperty)), + _code.SpaceAfter(Accessibility.ForSetter(edmProperty))); + } + + public string NavigationProperty(NavigationProperty navProp) + { + var endType = _typeMapper.GetTypeName(navProp.ToEndMember.GetEntityType()); + return string.Format( + CultureInfo.InvariantCulture, + "{0} {1} {2} {{ {3}get; {4}set; }}", + AccessibilityAndVirtual(Accessibility.ForNavigationProperty(navProp)), + navProp.ToEndMember.RelationshipMultiplicity == RelationshipMultiplicity.Many ? ("ICollection<" + endType + ">") : endType, + _code.Escape(navProp), + _code.SpaceAfter(Accessibility.ForGetter(navProp)), + _code.SpaceAfter(Accessibility.ForSetter(navProp))); + } + + public string AccessibilityAndVirtual(string accessibility) + { + return accessibility + (accessibility != "private" ? " virtual" : ""); + } + + public string EntityClassOpening(EntityType entity) + { + return string.Format( + CultureInfo.InvariantCulture, + "{0} {1}partial class {2}{3}", + Accessibility.ForType(entity), + _code.SpaceAfter(_code.AbstractOption(entity)), + _code.Escape(entity), + _code.StringBefore(" : ", _typeMapper.GetTypeName(entity.BaseType))); + } + + public string EnumOpening(SimpleType enumType) + { + return string.Format( + CultureInfo.InvariantCulture, + "{0} enum {1} : {2}", + Accessibility.ForType(enumType), + _code.Escape(enumType), + _code.Escape(_typeMapper.UnderlyingClrType(enumType))); + } + + public void WriteFunctionParameters(EdmFunction edmFunction, Action writeParameter) + { + var parameters = FunctionImportParameter.Create(edmFunction.Parameters, _code, _ef); + foreach (var parameter in parameters.Where(p => p.NeedsLocalVariable)) + { + var isNotNull = parameter.IsNullableOfT ? parameter.FunctionParameterName + ".HasValue" : parameter.FunctionParameterName + " != null"; + var notNullInit = "new ObjectParameter(\"" + parameter.EsqlParameterName + "\", " + parameter.FunctionParameterName + ")"; + var nullInit = "new ObjectParameter(\"" + parameter.EsqlParameterName + "\", typeof(" + TypeMapper.FixNamespaces(parameter.RawClrTypeName) + "))"; + writeParameter(parameter.LocalVariableName, isNotNull, notNullInit, nullInit); + } + } + + public string ComposableFunctionMethod(EdmFunction edmFunction, string modelNamespace) + { + var parameters = _typeMapper.GetParameters(edmFunction); + + return string.Format( + CultureInfo.InvariantCulture, + "{0} IQueryable<{1}> {2}({3})", + AccessibilityAndVirtual(Accessibility.ForMethod(edmFunction)), + _typeMapper.GetTypeName(_typeMapper.GetReturnType(edmFunction), modelNamespace), + _code.Escape(edmFunction), + string.Join(", ", parameters.Select(p => TypeMapper.FixNamespaces(p.FunctionParameterType) + " " + p.FunctionParameterName).ToArray())); + } + + public string ComposableCreateQuery(EdmFunction edmFunction, string modelNamespace) + { + var parameters = _typeMapper.GetParameters(edmFunction); + + return string.Format( + CultureInfo.InvariantCulture, + "return ((IObjectContextAdapter)this).ObjectContext.CreateQuery<{0}>(\"[{1}].[{2}]({3})\"{4});", + _typeMapper.GetTypeName(_typeMapper.GetReturnType(edmFunction), modelNamespace), + edmFunction.NamespaceName, + edmFunction.Name, + string.Join(", ", parameters.Select(p => "@" + p.EsqlParameterName).ToArray()), + _code.StringBefore(", ", string.Join(", ", parameters.Select(p => p.ExecuteParameterName).ToArray()))); + } + + public string FunctionMethod(EdmFunction edmFunction, string modelNamespace, bool includeMergeOption) + { + var parameters = _typeMapper.GetParameters(edmFunction); + var returnType = _typeMapper.GetReturnType(edmFunction); + + var paramList = String.Join(", ", parameters.Select(p => TypeMapper.FixNamespaces(p.FunctionParameterType) + " " + p.FunctionParameterName).ToArray()); + if (includeMergeOption) + { + paramList = _code.StringAfter(paramList, ", ") + "MergeOption mergeOption"; + } + + return string.Format( + CultureInfo.InvariantCulture, + "{0} {1} {2}({3})", + AccessibilityAndVirtual(Accessibility.ForMethod(edmFunction)), + returnType == null ? "int" : "ObjectResult<" + _typeMapper.GetTypeName(returnType, modelNamespace) + ">", + _code.Escape(edmFunction), + paramList); + } + + public string ExecuteFunction(EdmFunction edmFunction, string modelNamespace, bool includeMergeOption) + { + var parameters = _typeMapper.GetParameters(edmFunction); + var returnType = _typeMapper.GetReturnType(edmFunction); + + var callParams = _code.StringBefore(", ", String.Join(", ", parameters.Select(p => p.ExecuteParameterName).ToArray())); + if (includeMergeOption) + { + callParams = ", mergeOption" + callParams; + } + + return string.Format( + CultureInfo.InvariantCulture, + "return ((IObjectContextAdapter)this).ObjectContext.ExecuteFunction{0}(\"{1}\"{2});", + returnType == null ? "" : "<" + _typeMapper.GetTypeName(returnType, modelNamespace) + ">", + edmFunction.Name, + callParams); + } + + public string DbSet(EntitySet entitySet) + { + return string.Format( + CultureInfo.InvariantCulture, + "{0} virtual DbSet<{1}> {2} {{ get; set; }}", + Accessibility.ForReadOnlyProperty(entitySet), + _typeMapper.GetTypeName(entitySet.ElementType), + _code.Escape(entitySet)); + } + + public string DbSetInitializer(EntitySet entitySet) + { + return string.Format( + CultureInfo.InvariantCulture, + "{0} = Set<{1}>();", + _code.Escape(entitySet), + _typeMapper.GetTypeName(entitySet.ElementType)); + } + + public string UsingDirectives(bool inHeader, bool includeCollections = true) + { + return inHeader == string.IsNullOrEmpty(_code.VsNamespaceSuggestion()) + ? string.Format( + CultureInfo.InvariantCulture, + "{0}using System;{1}" + + "{2}", + inHeader ? Environment.NewLine : "", + includeCollections ? (Environment.NewLine + "using System.Collections.Generic;") : "", + inHeader ? "" : Environment.NewLine) + : ""; + } +} + +public class TypeMapper +{ + private const string ExternalTypeNameAttributeName = @"http://schemas.microsoft.com/ado/2006/04/codegeneration:ExternalTypeName"; + + private readonly System.Collections.IList _errors; + private readonly CodeGenerationTools _code; + private readonly MetadataTools _ef; + + public static string FixNamespaces(string typeName) + { + return typeName.Replace("System.Data.Spatial.", "System.Data.Entity.Spatial."); + } + + public TypeMapper(CodeGenerationTools code, MetadataTools ef, System.Collections.IList errors) + { + ArgumentNotNull(code, "code"); + ArgumentNotNull(ef, "ef"); + ArgumentNotNull(errors, "errors"); + + _code = code; + _ef = ef; + _errors = errors; + } + + public string GetTypeName(TypeUsage typeUsage) + { + return typeUsage == null ? null : GetTypeName(typeUsage.EdmType, _ef.IsNullable(typeUsage), modelNamespace: null); + } + + public string GetTypeName(EdmType edmType) + { + return GetTypeName(edmType, isNullable: null, modelNamespace: null); + } + + public string GetTypeName(TypeUsage typeUsage, string modelNamespace) + { + return typeUsage == null ? null : GetTypeName(typeUsage.EdmType, _ef.IsNullable(typeUsage), modelNamespace); + } + + public string GetTypeName(EdmType edmType, string modelNamespace) + { + return GetTypeName(edmType, isNullable: null, modelNamespace: modelNamespace); + } + + public string GetTypeName(EdmType edmType, bool? isNullable, string modelNamespace) + { + if (edmType == null) + { + return null; + } + + var collectionType = edmType as CollectionType; + if (collectionType != null) + { + return String.Format(CultureInfo.InvariantCulture, "ICollection<{0}>", GetTypeName(collectionType.TypeUsage, modelNamespace)); + } + + var typeName = _code.Escape(edmType.MetadataProperties + .Where(p => p.Name == ExternalTypeNameAttributeName) + .Select(p => (string)p.Value) + .FirstOrDefault()) + ?? (modelNamespace != null && edmType.NamespaceName != modelNamespace ? + _code.CreateFullName(_code.EscapeNamespace(edmType.NamespaceName), _code.Escape(edmType)) : + _code.Escape(edmType)); + + if (edmType is StructuralType) + { + return typeName; + } + + if (edmType is SimpleType) + { + var clrType = UnderlyingClrType(edmType); + if (!IsEnumType(edmType)) + { + typeName = _code.Escape(clrType); + } + + typeName = FixNamespaces(typeName); + + return clrType.IsValueType && isNullable == true ? + String.Format(CultureInfo.InvariantCulture, "Nullable<{0}>", typeName) : + typeName; + } + + throw new ArgumentException("edmType"); + } + + public Type UnderlyingClrType(EdmType edmType) + { + ArgumentNotNull(edmType, "edmType"); + + var primitiveType = edmType as PrimitiveType; + if (primitiveType != null) + { + return primitiveType.ClrEquivalentType; + } + + if (IsEnumType(edmType)) + { + return GetEnumUnderlyingType(edmType).ClrEquivalentType; + } + + return typeof(object); + } + + public object GetEnumMemberValue(MetadataItem enumMember) + { + ArgumentNotNull(enumMember, "enumMember"); + + var valueProperty = enumMember.GetType().GetProperty("Value"); + return valueProperty == null ? null : valueProperty.GetValue(enumMember, null); + } + + public string GetEnumMemberName(MetadataItem enumMember) + { + ArgumentNotNull(enumMember, "enumMember"); + + var nameProperty = enumMember.GetType().GetProperty("Name"); + return nameProperty == null ? null : (string)nameProperty.GetValue(enumMember, null); + } + + public System.Collections.IEnumerable GetEnumMembers(EdmType enumType) + { + ArgumentNotNull(enumType, "enumType"); + + var membersProperty = enumType.GetType().GetProperty("Members"); + return membersProperty != null + ? (System.Collections.IEnumerable)membersProperty.GetValue(enumType, null) + : Enumerable.Empty(); + } + + public bool EnumIsFlags(EdmType enumType) + { + ArgumentNotNull(enumType, "enumType"); + + var isFlagsProperty = enumType.GetType().GetProperty("IsFlags"); + return isFlagsProperty != null && (bool)isFlagsProperty.GetValue(enumType, null); + } + + public bool IsEnumType(GlobalItem edmType) + { + ArgumentNotNull(edmType, "edmType"); + + return edmType.GetType().Name == "EnumType"; + } + + public PrimitiveType GetEnumUnderlyingType(EdmType enumType) + { + ArgumentNotNull(enumType, "enumType"); + + return (PrimitiveType)enumType.GetType().GetProperty("UnderlyingType").GetValue(enumType, null); + } + + public string CreateLiteral(object value) + { + if (value == null || value.GetType() != typeof(TimeSpan)) + { + return _code.CreateLiteral(value); + } + + return string.Format(CultureInfo.InvariantCulture, "new TimeSpan({0})", ((TimeSpan)value).Ticks); + } + + public bool VerifyCaseInsensitiveTypeUniqueness(IEnumerable types, string sourceFile) + { + ArgumentNotNull(types, "types"); + ArgumentNotNull(sourceFile, "sourceFile"); + + var hash = new HashSet(StringComparer.InvariantCultureIgnoreCase); + if (types.Any(item => !hash.Add(item))) + { + _errors.Add( + new CompilerError(sourceFile, -1, -1, "6023", + String.Format(CultureInfo.CurrentCulture, CodeGenerationTools.GetResourceString("Template_CaseInsensitiveTypeConflict")))); + return false; + } + return true; + } + + public IEnumerable GetEnumItemsToGenerate(IEnumerable itemCollection) + { + return GetItemsToGenerate(itemCollection) + .Where(e => IsEnumType(e)); + } + + public IEnumerable GetItemsToGenerate(IEnumerable itemCollection) where T: EdmType + { + return itemCollection + .OfType() + .Where(i => !i.MetadataProperties.Any(p => p.Name == ExternalTypeNameAttributeName)) + .OrderBy(i => i.Name); + } + + public IEnumerable GetAllGlobalItems(IEnumerable itemCollection) + { + return itemCollection + .Where(i => i is EntityType || i is ComplexType || i is EntityContainer || IsEnumType(i)) + .Select(g => GetGlobalItemName(g)); + } + + public string GetGlobalItemName(GlobalItem item) + { + if (item is EdmType) + { + return ((EdmType)item).Name; + } + else + { + return ((EntityContainer)item).Name; + } + } + + public IEnumerable GetSimpleProperties(EntityType type) + { + return type.Properties.Where(p => p.TypeUsage.EdmType is SimpleType && p.DeclaringType == type); + } + + public IEnumerable GetSimpleProperties(ComplexType type) + { + return type.Properties.Where(p => p.TypeUsage.EdmType is SimpleType && p.DeclaringType == type); + } + + public IEnumerable GetComplexProperties(EntityType type) + { + return type.Properties.Where(p => p.TypeUsage.EdmType is ComplexType && p.DeclaringType == type); + } + + public IEnumerable GetComplexProperties(ComplexType type) + { + return type.Properties.Where(p => p.TypeUsage.EdmType is ComplexType && p.DeclaringType == type); + } + + public IEnumerable GetPropertiesWithDefaultValues(EntityType type) + { + return type.Properties.Where(p => p.TypeUsage.EdmType is SimpleType && p.DeclaringType == type && p.DefaultValue != null); + } + + public IEnumerable GetPropertiesWithDefaultValues(ComplexType type) + { + return type.Properties.Where(p => p.TypeUsage.EdmType is SimpleType && p.DeclaringType == type && p.DefaultValue != null); + } + + public IEnumerable GetNavigationProperties(EntityType type) + { + return type.NavigationProperties.Where(np => np.DeclaringType == type); + } + + public IEnumerable GetCollectionNavigationProperties(EntityType type) + { + return type.NavigationProperties.Where(np => np.DeclaringType == type && np.ToEndMember.RelationshipMultiplicity == RelationshipMultiplicity.Many); + } + + public FunctionParameter GetReturnParameter(EdmFunction edmFunction) + { + ArgumentNotNull(edmFunction, "edmFunction"); + + var returnParamsProperty = edmFunction.GetType().GetProperty("ReturnParameters"); + return returnParamsProperty == null + ? edmFunction.ReturnParameter + : ((IEnumerable)returnParamsProperty.GetValue(edmFunction, null)).FirstOrDefault(); + } + + public bool IsComposable(EdmFunction edmFunction) + { + ArgumentNotNull(edmFunction, "edmFunction"); + + var isComposableProperty = edmFunction.GetType().GetProperty("IsComposableAttribute"); + return isComposableProperty != null && (bool)isComposableProperty.GetValue(edmFunction, null); + } + + public IEnumerable GetParameters(EdmFunction edmFunction) + { + return FunctionImportParameter.Create(edmFunction.Parameters, _code, _ef); + } + + public TypeUsage GetReturnType(EdmFunction edmFunction) + { + var returnParam = GetReturnParameter(edmFunction); + return returnParam == null ? null : _ef.GetElementType(returnParam.TypeUsage); + } + + public bool GenerateMergeOptionFunction(EdmFunction edmFunction, bool includeMergeOption) + { + var returnType = GetReturnType(edmFunction); + return !includeMergeOption && returnType != null && returnType.EdmType.BuiltInTypeKind == BuiltInTypeKind.EntityType; + } +} + +public static void ArgumentNotNull(T arg, string name) where T : class +{ + if (arg == null) + { + throw new ArgumentNullException(name); + } +} +#> \ No newline at end of file diff --git a/Gordon360/Models/MyGordon_DB_Models.Designer.cs b/Gordon360/Models/MyGordon_DB_Models.Designer.cs new file mode 100644 index 000000000..d319f694a --- /dev/null +++ b/Gordon360/Models/MyGordon_DB_Models.Designer.cs @@ -0,0 +1,10 @@ +// T4 code generation is enabled for model 'C:\Users\cct.service\Documents\gordon-360-api\Gordon360\Models\MyGordon_DB_Models.edmx'. +// To enable legacy code generation, change the value of the 'Code Generation Strategy' designer +// property to 'Legacy ObjectContext'. This property is available in the Properties Window when the model +// is open in the designer. + +// If no context and entity classes have been generated, it may be because you created an empty model but +// have not yet chosen which version of Entity Framework to use. To generate a context class and entity +// classes for your model, open the model in the designer, right-click on the designer surface, and +// select 'Update Model from Database...', 'Generate Database from Model...', or 'Add Code Generation +// Item...'. \ No newline at end of file diff --git a/Gordon360/Models/MyGordon_DB_Models.cs b/Gordon360/Models/MyGordon_DB_Models.cs new file mode 100644 index 000000000..7cc066228 --- /dev/null +++ b/Gordon360/Models/MyGordon_DB_Models.cs @@ -0,0 +1,9 @@ +//------------------------------------------------------------------------------ +// +// This code was generated from a template. +// +// Manual changes to this file may cause unexpected behavior in your application. +// Manual changes to this file will be overwritten if the code is regenerated. +// +//------------------------------------------------------------------------------ + diff --git a/Gordon360/Models/MyGordon_DB_Models.edmx b/Gordon360/Models/MyGordon_DB_Models.edmx new file mode 100644 index 000000000..0348089ba --- /dev/null +++ b/Gordon360/Models/MyGordon_DB_Models.edmx @@ -0,0 +1,1379 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + SELECT + [Countries].[CTY] AS [CTY], + [Countries].[COUNTRY] AS [COUNTRY] + FROM [dbo].[Countries] AS [Countries] + + + SELECT + [view_cct_alumni].[ID] AS [ID], + [view_cct_alumni].[WebUpdate] AS [WebUpdate], + [view_cct_alumni].[Title] AS [Title], + [view_cct_alumni].[FirstName] AS [FirstName], + [view_cct_alumni].[MiddleName] AS [MiddleName], + [view_cct_alumni].[LastName] AS [LastName], + [view_cct_alumni].[Suffix] AS [Suffix], + [view_cct_alumni].[MaidenName] AS [MaidenName], + [view_cct_alumni].[NickName] AS [NickName], + [view_cct_alumni].[HomeStreet1] AS [HomeStreet1], + [view_cct_alumni].[HomeStreet2] AS [HomeStreet2], + [view_cct_alumni].[HomeCity] AS [HomeCity], + [view_cct_alumni].[HomeState] AS [HomeState], + [view_cct_alumni].[HomePostalCode] AS [HomePostalCode], + [view_cct_alumni].[HomeCountry] AS [HomeCountry], + [view_cct_alumni].[HomePhone] AS [HomePhone], + [view_cct_alumni].[HomeFax] AS [HomeFax], + [view_cct_alumni].[HomeEmail] AS [HomeEmail], + [view_cct_alumni].[JobTitle] AS [JobTitle], + [view_cct_alumni].[MaritalStatus] AS [MaritalStatus], + [view_cct_alumni].[SpouseName] AS [SpouseName], + [view_cct_alumni].[College] AS [College], + [view_cct_alumni].[ClassYear] AS [ClassYear], + [view_cct_alumni].[PreferredClassYear] AS [PreferredClassYear], + [view_cct_alumni].[Major1] AS [Major1], + [view_cct_alumni].[Major2] AS [Major2], + [view_cct_alumni].[ShareName] AS [ShareName], + [view_cct_alumni].[ShareAddress] AS [ShareAddress], + [view_cct_alumni].[Gender] AS [Gender], + [view_cct_alumni].[GradDate] AS [GradDate], + [view_cct_alumni].[Email] AS [Email], + [view_cct_alumni].[grad_student] AS [grad_student], + [view_cct_alumni].[Barcode] AS [Barcode] + FROM [dbo].[view_cct_alumni] AS [view_cct_alumni] + + + SELECT + [view_cct_ChapelEvent].[ROWID] AS [ROWID], + [view_cct_ChapelEvent].[CHBarEventID] AS [CHBarEventID], + [view_cct_ChapelEvent].[ID_NUM] AS [ID_NUM], + [view_cct_ChapelEvent].[CHBarcode] AS [CHBarcode], + [view_cct_ChapelEvent].[CHEventID] AS [CHEventID], + [view_cct_ChapelEvent].[CHCheckerID] AS [CHCheckerID], + [view_cct_ChapelEvent].[CHDate] AS [CHDate], + [view_cct_ChapelEvent].[CHTime] AS [CHTime], + [view_cct_ChapelEvent].[CHSource] AS [CHSource], + [view_cct_ChapelEvent].[CHTermCD] AS [CHTermCD], + [view_cct_ChapelEvent].[Attended] AS [Attended], + [view_cct_ChapelEvent].[Required] AS [Required], + [view_cct_ChapelEvent].[LiveID] AS [LiveID] + FROM [dbo].[view_cct_ChapelEvent] AS [view_cct_ChapelEvent] + + + SELECT + [view_cct_facstaff].[ID] AS [ID], + [view_cct_facstaff].[Title] AS [Title], + [view_cct_facstaff].[FirstName] AS [FirstName], + [view_cct_facstaff].[MiddleName] AS [MiddleName], + [view_cct_facstaff].[LastName] AS [LastName], + [view_cct_facstaff].[Suffix] AS [Suffix], + [view_cct_facstaff].[MaidenName] AS [MaidenName], + [view_cct_facstaff].[Nickname] AS [Nickname], + [view_cct_facstaff].[OnCampusDepartment] AS [OnCampusDepartment], + [view_cct_facstaff].[OnCampusBuilding] AS [OnCampusBuilding], + [view_cct_facstaff].[OnCampusRoom] AS [OnCampusRoom], + [view_cct_facstaff].[OnCampusPhone] AS [OnCampusPhone], + [view_cct_facstaff].[OnCampusPrivatePhone] AS [OnCampusPrivatePhone], + [view_cct_facstaff].[OnCampusFax] AS [OnCampusFax], + [view_cct_facstaff].[HomeStreet1] AS [HomeStreet1], + [view_cct_facstaff].[HomeStreet2] AS [HomeStreet2], + [view_cct_facstaff].[HomeCity] AS [HomeCity], + [view_cct_facstaff].[HomeState] AS [HomeState], + [view_cct_facstaff].[HomePostalCode] AS [HomePostalCode], + [view_cct_facstaff].[HomeCountry] AS [HomeCountry], + [view_cct_facstaff].[HomePhone] AS [HomePhone], + [view_cct_facstaff].[HomeFax] AS [HomeFax], + [view_cct_facstaff].[KeepPrivate] AS [KeepPrivate], + [view_cct_facstaff].[JobTitle] AS [JobTitle], + [view_cct_facstaff].[SpouseName] AS [SpouseName], + [view_cct_facstaff].[Dept] AS [Dept], + [view_cct_facstaff].[Barcode] AS [Barcode], + [view_cct_facstaff].[Gender] AS [Gender], + [view_cct_facstaff].[Email] AS [Email], + [view_cct_facstaff].[Type] AS [Type] + FROM [dbo].[view_cct_facstaff] AS [view_cct_facstaff] + + + SELECT + [view_cct_student].[ID] AS [ID], + [view_cct_student].[Title] AS [Title], + [view_cct_student].[FirstName] AS [FirstName], + [view_cct_student].[MiddleName] AS [MiddleName], + [view_cct_student].[LastName] AS [LastName], + [view_cct_student].[Suffix] AS [Suffix], + [view_cct_student].[MaidenName] AS [MaidenName], + [view_cct_student].[NickName] AS [NickName], + [view_cct_student].[OnOffCampus] AS [OnOffCampus], + [view_cct_student].[OnCampusBuilding] AS [OnCampusBuilding], + [view_cct_student].[OnCampusRoom] AS [OnCampusRoom], + [view_cct_student].[OnCampusPhone] AS [OnCampusPhone], + [view_cct_student].[OnCampusPrivatePhone] AS [OnCampusPrivatePhone], + [view_cct_student].[OnCampusFax] AS [OnCampusFax], + [view_cct_student].[OffCampusStreet1] AS [OffCampusStreet1], + [view_cct_student].[OffCampusStreet2] AS [OffCampusStreet2], + [view_cct_student].[OffCampusCity] AS [OffCampusCity], + [view_cct_student].[OffCampusState] AS [OffCampusState], + [view_cct_student].[OffCampusPostalCode] AS [OffCampusPostalCode], + [view_cct_student].[OffCampusCountry] AS [OffCampusCountry], + [view_cct_student].[OffCampusPhone] AS [OffCampusPhone], + [view_cct_student].[OffCampusFax] AS [OffCampusFax], + [view_cct_student].[HomeStreet1] AS [HomeStreet1], + [view_cct_student].[HomeStreet2] AS [HomeStreet2], + [view_cct_student].[HomeCity] AS [HomeCity], + [view_cct_student].[HomeState] AS [HomeState], + [view_cct_student].[HomePostalCode] AS [HomePostalCode], + [view_cct_student].[HomeCountry] AS [HomeCountry], + [view_cct_student].[HomePhone] AS [HomePhone], + [view_cct_student].[HomeFax] AS [HomeFax], + [view_cct_student].[Cohort] AS [Cohort], + [view_cct_student].[Class] AS [Class], + [view_cct_student].[KeepPrivate] AS [KeepPrivate], + [view_cct_student].[Major] AS [Major], + [view_cct_student].[Barcode] AS [Barcode], + [view_cct_student].[AdvisorIDs] AS [AdvisorIDs], + [view_cct_student].[Married] AS [Married], + [view_cct_student].[Commuter] AS [Commuter], + [view_cct_student].[Major2] AS [Major2], + [view_cct_student].[Email] AS [Email], + [view_cct_student].[Gender] AS [Gender], + [view_cct_student].[grad_student] AS [grad_student], + [view_cct_student].[GradDate] AS [GradDate], + [view_cct_student].[Major3] AS [Major3], + [view_cct_student].[Minor1] AS [Minor1], + [view_cct_student].[Minor2] AS [Minor2], + [view_cct_student].[Minor3] AS [Minor3], + [view_cct_student].[MobilePhone] AS [MobilePhone], + [view_cct_student].[IsMobilePhonePrivate] AS [IsMobilePhonePrivate] + FROM [dbo].[view_cct_student] AS [view_cct_student] + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Gordon360/Models/MyGordon_DB_Models.edmx.diagram b/Gordon360/Models/MyGordon_DB_Models.edmx.diagram new file mode 100644 index 000000000..476257108 --- /dev/null +++ b/Gordon360/Models/MyGordon_DB_Models.edmx.diagram @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Gordon360/Models/MyGordon_DB_Models.tt b/Gordon360/Models/MyGordon_DB_Models.tt new file mode 100644 index 000000000..068071978 --- /dev/null +++ b/Gordon360/Models/MyGordon_DB_Models.tt @@ -0,0 +1,733 @@ +<#@ template language="C#" debug="false" hostspecific="true"#> +<#@ include file="EF6.Utility.CS.ttinclude"#><#@ + output extension=".cs"#><# + +const string inputFile = @"MyGordon_DB_Models.edmx"; +var textTransform = DynamicTextTransformation.Create(this); +var code = new CodeGenerationTools(this); +var ef = new MetadataTools(this); +var typeMapper = new TypeMapper(code, ef, textTransform.Errors); +var fileManager = EntityFrameworkTemplateFileManager.Create(this); +var itemCollection = new EdmMetadataLoader(textTransform.Host, textTransform.Errors).CreateEdmItemCollection(inputFile); +var codeStringGenerator = new CodeStringGenerator(code, typeMapper, ef); + +if (!typeMapper.VerifyCaseInsensitiveTypeUniqueness(typeMapper.GetAllGlobalItems(itemCollection), inputFile)) +{ + return string.Empty; +} + +WriteHeader(codeStringGenerator, fileManager); + +foreach (var entity in typeMapper.GetItemsToGenerate(itemCollection)) +{ + fileManager.StartNewFile(entity.Name + ".cs"); + BeginNamespace(code); +#> +<#=codeStringGenerator.UsingDirectives(inHeader: false)#> +<#=codeStringGenerator.EntityClassOpening(entity)#> +{ +<# + var propertiesWithDefaultValues = typeMapper.GetPropertiesWithDefaultValues(entity); + var collectionNavigationProperties = typeMapper.GetCollectionNavigationProperties(entity); + var complexProperties = typeMapper.GetComplexProperties(entity); + + if (propertiesWithDefaultValues.Any() || collectionNavigationProperties.Any() || complexProperties.Any()) + { +#> + [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2214:DoNotCallOverridableMethodsInConstructors")] + public <#=code.Escape(entity)#>() + { +<# + foreach (var edmProperty in propertiesWithDefaultValues) + { +#> + this.<#=code.Escape(edmProperty)#> = <#=typeMapper.CreateLiteral(edmProperty.DefaultValue)#>; +<# + } + + foreach (var navigationProperty in collectionNavigationProperties) + { +#> + this.<#=code.Escape(navigationProperty)#> = new HashSet<<#=typeMapper.GetTypeName(navigationProperty.ToEndMember.GetEntityType())#>>(); +<# + } + + foreach (var complexProperty in complexProperties) + { +#> + this.<#=code.Escape(complexProperty)#> = new <#=typeMapper.GetTypeName(complexProperty.TypeUsage)#>(); +<# + } +#> + } + +<# + } + + var simpleProperties = typeMapper.GetSimpleProperties(entity); + if (simpleProperties.Any()) + { + foreach (var edmProperty in simpleProperties) + { +#> + <#=codeStringGenerator.Property(edmProperty)#> +<# + } + } + + if (complexProperties.Any()) + { +#> + +<# + foreach(var complexProperty in complexProperties) + { +#> + <#=codeStringGenerator.Property(complexProperty)#> +<# + } + } + + var navigationProperties = typeMapper.GetNavigationProperties(entity); + if (navigationProperties.Any()) + { +#> + +<# + foreach (var navigationProperty in navigationProperties) + { + if (navigationProperty.ToEndMember.RelationshipMultiplicity == RelationshipMultiplicity.Many) + { +#> + [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")] +<# + } +#> + <#=codeStringGenerator.NavigationProperty(navigationProperty)#> +<# + } + } +#> +} +<# + EndNamespace(code); +} + +foreach (var complex in typeMapper.GetItemsToGenerate(itemCollection)) +{ + fileManager.StartNewFile(complex.Name + ".cs"); + BeginNamespace(code); +#> +<#=codeStringGenerator.UsingDirectives(inHeader: false, includeCollections: false)#> +<#=Accessibility.ForType(complex)#> partial class <#=code.Escape(complex)#> +{ +<# + var complexProperties = typeMapper.GetComplexProperties(complex); + var propertiesWithDefaultValues = typeMapper.GetPropertiesWithDefaultValues(complex); + + if (propertiesWithDefaultValues.Any() || complexProperties.Any()) + { +#> + public <#=code.Escape(complex)#>() + { +<# + foreach (var edmProperty in propertiesWithDefaultValues) + { +#> + this.<#=code.Escape(edmProperty)#> = <#=typeMapper.CreateLiteral(edmProperty.DefaultValue)#>; +<# + } + + foreach (var complexProperty in complexProperties) + { +#> + this.<#=code.Escape(complexProperty)#> = new <#=typeMapper.GetTypeName(complexProperty.TypeUsage)#>(); +<# + } +#> + } + +<# + } + + var simpleProperties = typeMapper.GetSimpleProperties(complex); + if (simpleProperties.Any()) + { + foreach(var edmProperty in simpleProperties) + { +#> + <#=codeStringGenerator.Property(edmProperty)#> +<# + } + } + + if (complexProperties.Any()) + { +#> + +<# + foreach(var edmProperty in complexProperties) + { +#> + <#=codeStringGenerator.Property(edmProperty)#> +<# + } + } +#> +} +<# + EndNamespace(code); +} + +foreach (var enumType in typeMapper.GetEnumItemsToGenerate(itemCollection)) +{ + fileManager.StartNewFile(enumType.Name + ".cs"); + BeginNamespace(code); +#> +<#=codeStringGenerator.UsingDirectives(inHeader: false, includeCollections: false)#> +<# + if (typeMapper.EnumIsFlags(enumType)) + { +#> +[Flags] +<# + } +#> +<#=codeStringGenerator.EnumOpening(enumType)#> +{ +<# + var foundOne = false; + + foreach (MetadataItem member in typeMapper.GetEnumMembers(enumType)) + { + foundOne = true; +#> + <#=code.Escape(typeMapper.GetEnumMemberName(member))#> = <#=typeMapper.GetEnumMemberValue(member)#>, +<# + } + + if (foundOne) + { + this.GenerationEnvironment.Remove(this.GenerationEnvironment.Length - 3, 1); + } +#> +} +<# + EndNamespace(code); +} + +fileManager.Process(); + +#> +<#+ + +public void WriteHeader(CodeStringGenerator codeStringGenerator, EntityFrameworkTemplateFileManager fileManager) +{ + fileManager.StartHeader(); +#> +//------------------------------------------------------------------------------ +// +// <#=CodeGenerationTools.GetResourceString("Template_GeneratedCodeCommentLine1")#> +// +// <#=CodeGenerationTools.GetResourceString("Template_GeneratedCodeCommentLine2")#> +// <#=CodeGenerationTools.GetResourceString("Template_GeneratedCodeCommentLine3")#> +// +//------------------------------------------------------------------------------ +<#=codeStringGenerator.UsingDirectives(inHeader: true)#> +<#+ + fileManager.EndBlock(); +} + +public void BeginNamespace(CodeGenerationTools code) +{ + var codeNamespace = code.VsNamespaceSuggestion(); + if (!String.IsNullOrEmpty(codeNamespace)) + { +#> +namespace <#=code.EscapeNamespace(codeNamespace)#> +{ +<#+ + PushIndent(" "); + } +} + +public void EndNamespace(CodeGenerationTools code) +{ + if (!String.IsNullOrEmpty(code.VsNamespaceSuggestion())) + { + PopIndent(); +#> +} +<#+ + } +} + +public const string TemplateId = "CSharp_DbContext_Types_EF6"; + +public class CodeStringGenerator +{ + private readonly CodeGenerationTools _code; + private readonly TypeMapper _typeMapper; + private readonly MetadataTools _ef; + + public CodeStringGenerator(CodeGenerationTools code, TypeMapper typeMapper, MetadataTools ef) + { + ArgumentNotNull(code, "code"); + ArgumentNotNull(typeMapper, "typeMapper"); + ArgumentNotNull(ef, "ef"); + + _code = code; + _typeMapper = typeMapper; + _ef = ef; + } + + public string Property(EdmProperty edmProperty) + { + return string.Format( + CultureInfo.InvariantCulture, + "{0} {1} {2} {{ {3}get; {4}set; }}", + Accessibility.ForProperty(edmProperty), + _typeMapper.GetTypeName(edmProperty.TypeUsage), + _code.Escape(edmProperty), + _code.SpaceAfter(Accessibility.ForGetter(edmProperty)), + _code.SpaceAfter(Accessibility.ForSetter(edmProperty))); + } + + public string NavigationProperty(NavigationProperty navProp) + { + var endType = _typeMapper.GetTypeName(navProp.ToEndMember.GetEntityType()); + return string.Format( + CultureInfo.InvariantCulture, + "{0} {1} {2} {{ {3}get; {4}set; }}", + AccessibilityAndVirtual(Accessibility.ForNavigationProperty(navProp)), + navProp.ToEndMember.RelationshipMultiplicity == RelationshipMultiplicity.Many ? ("ICollection<" + endType + ">") : endType, + _code.Escape(navProp), + _code.SpaceAfter(Accessibility.ForGetter(navProp)), + _code.SpaceAfter(Accessibility.ForSetter(navProp))); + } + + public string AccessibilityAndVirtual(string accessibility) + { + return accessibility + (accessibility != "private" ? " virtual" : ""); + } + + public string EntityClassOpening(EntityType entity) + { + return string.Format( + CultureInfo.InvariantCulture, + "{0} {1}partial class {2}{3}", + Accessibility.ForType(entity), + _code.SpaceAfter(_code.AbstractOption(entity)), + _code.Escape(entity), + _code.StringBefore(" : ", _typeMapper.GetTypeName(entity.BaseType))); + } + + public string EnumOpening(SimpleType enumType) + { + return string.Format( + CultureInfo.InvariantCulture, + "{0} enum {1} : {2}", + Accessibility.ForType(enumType), + _code.Escape(enumType), + _code.Escape(_typeMapper.UnderlyingClrType(enumType))); + } + + public void WriteFunctionParameters(EdmFunction edmFunction, Action writeParameter) + { + var parameters = FunctionImportParameter.Create(edmFunction.Parameters, _code, _ef); + foreach (var parameter in parameters.Where(p => p.NeedsLocalVariable)) + { + var isNotNull = parameter.IsNullableOfT ? parameter.FunctionParameterName + ".HasValue" : parameter.FunctionParameterName + " != null"; + var notNullInit = "new ObjectParameter(\"" + parameter.EsqlParameterName + "\", " + parameter.FunctionParameterName + ")"; + var nullInit = "new ObjectParameter(\"" + parameter.EsqlParameterName + "\", typeof(" + TypeMapper.FixNamespaces(parameter.RawClrTypeName) + "))"; + writeParameter(parameter.LocalVariableName, isNotNull, notNullInit, nullInit); + } + } + + public string ComposableFunctionMethod(EdmFunction edmFunction, string modelNamespace) + { + var parameters = _typeMapper.GetParameters(edmFunction); + + return string.Format( + CultureInfo.InvariantCulture, + "{0} IQueryable<{1}> {2}({3})", + AccessibilityAndVirtual(Accessibility.ForMethod(edmFunction)), + _typeMapper.GetTypeName(_typeMapper.GetReturnType(edmFunction), modelNamespace), + _code.Escape(edmFunction), + string.Join(", ", parameters.Select(p => TypeMapper.FixNamespaces(p.FunctionParameterType) + " " + p.FunctionParameterName).ToArray())); + } + + public string ComposableCreateQuery(EdmFunction edmFunction, string modelNamespace) + { + var parameters = _typeMapper.GetParameters(edmFunction); + + return string.Format( + CultureInfo.InvariantCulture, + "return ((IObjectContextAdapter)this).ObjectContext.CreateQuery<{0}>(\"[{1}].[{2}]({3})\"{4});", + _typeMapper.GetTypeName(_typeMapper.GetReturnType(edmFunction), modelNamespace), + edmFunction.NamespaceName, + edmFunction.Name, + string.Join(", ", parameters.Select(p => "@" + p.EsqlParameterName).ToArray()), + _code.StringBefore(", ", string.Join(", ", parameters.Select(p => p.ExecuteParameterName).ToArray()))); + } + + public string FunctionMethod(EdmFunction edmFunction, string modelNamespace, bool includeMergeOption) + { + var parameters = _typeMapper.GetParameters(edmFunction); + var returnType = _typeMapper.GetReturnType(edmFunction); + + var paramList = String.Join(", ", parameters.Select(p => TypeMapper.FixNamespaces(p.FunctionParameterType) + " " + p.FunctionParameterName).ToArray()); + if (includeMergeOption) + { + paramList = _code.StringAfter(paramList, ", ") + "MergeOption mergeOption"; + } + + return string.Format( + CultureInfo.InvariantCulture, + "{0} {1} {2}({3})", + AccessibilityAndVirtual(Accessibility.ForMethod(edmFunction)), + returnType == null ? "int" : "ObjectResult<" + _typeMapper.GetTypeName(returnType, modelNamespace) + ">", + _code.Escape(edmFunction), + paramList); + } + + public string ExecuteFunction(EdmFunction edmFunction, string modelNamespace, bool includeMergeOption) + { + var parameters = _typeMapper.GetParameters(edmFunction); + var returnType = _typeMapper.GetReturnType(edmFunction); + + var callParams = _code.StringBefore(", ", String.Join(", ", parameters.Select(p => p.ExecuteParameterName).ToArray())); + if (includeMergeOption) + { + callParams = ", mergeOption" + callParams; + } + + return string.Format( + CultureInfo.InvariantCulture, + "return ((IObjectContextAdapter)this).ObjectContext.ExecuteFunction{0}(\"{1}\"{2});", + returnType == null ? "" : "<" + _typeMapper.GetTypeName(returnType, modelNamespace) + ">", + edmFunction.Name, + callParams); + } + + public string DbSet(EntitySet entitySet) + { + return string.Format( + CultureInfo.InvariantCulture, + "{0} virtual DbSet<{1}> {2} {{ get; set; }}", + Accessibility.ForReadOnlyProperty(entitySet), + _typeMapper.GetTypeName(entitySet.ElementType), + _code.Escape(entitySet)); + } + + public string UsingDirectives(bool inHeader, bool includeCollections = true) + { + return inHeader == string.IsNullOrEmpty(_code.VsNamespaceSuggestion()) + ? string.Format( + CultureInfo.InvariantCulture, + "{0}using System;{1}" + + "{2}", + inHeader ? Environment.NewLine : "", + includeCollections ? (Environment.NewLine + "using System.Collections.Generic;") : "", + inHeader ? "" : Environment.NewLine) + : ""; + } +} + +public class TypeMapper +{ + private const string ExternalTypeNameAttributeName = @"http://schemas.microsoft.com/ado/2006/04/codegeneration:ExternalTypeName"; + + private readonly System.Collections.IList _errors; + private readonly CodeGenerationTools _code; + private readonly MetadataTools _ef; + + public TypeMapper(CodeGenerationTools code, MetadataTools ef, System.Collections.IList errors) + { + ArgumentNotNull(code, "code"); + ArgumentNotNull(ef, "ef"); + ArgumentNotNull(errors, "errors"); + + _code = code; + _ef = ef; + _errors = errors; + } + + public static string FixNamespaces(string typeName) + { + return typeName.Replace("System.Data.Spatial.", "System.Data.Entity.Spatial."); + } + + public string GetTypeName(TypeUsage typeUsage) + { + return typeUsage == null ? null : GetTypeName(typeUsage.EdmType, _ef.IsNullable(typeUsage), modelNamespace: null); + } + + public string GetTypeName(EdmType edmType) + { + return GetTypeName(edmType, isNullable: null, modelNamespace: null); + } + + public string GetTypeName(TypeUsage typeUsage, string modelNamespace) + { + return typeUsage == null ? null : GetTypeName(typeUsage.EdmType, _ef.IsNullable(typeUsage), modelNamespace); + } + + public string GetTypeName(EdmType edmType, string modelNamespace) + { + return GetTypeName(edmType, isNullable: null, modelNamespace: modelNamespace); + } + + public string GetTypeName(EdmType edmType, bool? isNullable, string modelNamespace) + { + if (edmType == null) + { + return null; + } + + var collectionType = edmType as CollectionType; + if (collectionType != null) + { + return String.Format(CultureInfo.InvariantCulture, "ICollection<{0}>", GetTypeName(collectionType.TypeUsage, modelNamespace)); + } + + var typeName = _code.Escape(edmType.MetadataProperties + .Where(p => p.Name == ExternalTypeNameAttributeName) + .Select(p => (string)p.Value) + .FirstOrDefault()) + ?? (modelNamespace != null && edmType.NamespaceName != modelNamespace ? + _code.CreateFullName(_code.EscapeNamespace(edmType.NamespaceName), _code.Escape(edmType)) : + _code.Escape(edmType)); + + if (edmType is StructuralType) + { + return typeName; + } + + if (edmType is SimpleType) + { + var clrType = UnderlyingClrType(edmType); + if (!IsEnumType(edmType)) + { + typeName = _code.Escape(clrType); + } + + typeName = FixNamespaces(typeName); + + return clrType.IsValueType && isNullable == true ? + String.Format(CultureInfo.InvariantCulture, "Nullable<{0}>", typeName) : + typeName; + } + + throw new ArgumentException("edmType"); + } + + public Type UnderlyingClrType(EdmType edmType) + { + ArgumentNotNull(edmType, "edmType"); + + var primitiveType = edmType as PrimitiveType; + if (primitiveType != null) + { + return primitiveType.ClrEquivalentType; + } + + if (IsEnumType(edmType)) + { + return GetEnumUnderlyingType(edmType).ClrEquivalentType; + } + + return typeof(object); + } + + public object GetEnumMemberValue(MetadataItem enumMember) + { + ArgumentNotNull(enumMember, "enumMember"); + + var valueProperty = enumMember.GetType().GetProperty("Value"); + return valueProperty == null ? null : valueProperty.GetValue(enumMember, null); + } + + public string GetEnumMemberName(MetadataItem enumMember) + { + ArgumentNotNull(enumMember, "enumMember"); + + var nameProperty = enumMember.GetType().GetProperty("Name"); + return nameProperty == null ? null : (string)nameProperty.GetValue(enumMember, null); + } + + public System.Collections.IEnumerable GetEnumMembers(EdmType enumType) + { + ArgumentNotNull(enumType, "enumType"); + + var membersProperty = enumType.GetType().GetProperty("Members"); + return membersProperty != null + ? (System.Collections.IEnumerable)membersProperty.GetValue(enumType, null) + : Enumerable.Empty(); + } + + public bool EnumIsFlags(EdmType enumType) + { + ArgumentNotNull(enumType, "enumType"); + + var isFlagsProperty = enumType.GetType().GetProperty("IsFlags"); + return isFlagsProperty != null && (bool)isFlagsProperty.GetValue(enumType, null); + } + + public bool IsEnumType(GlobalItem edmType) + { + ArgumentNotNull(edmType, "edmType"); + + return edmType.GetType().Name == "EnumType"; + } + + public PrimitiveType GetEnumUnderlyingType(EdmType enumType) + { + ArgumentNotNull(enumType, "enumType"); + + return (PrimitiveType)enumType.GetType().GetProperty("UnderlyingType").GetValue(enumType, null); + } + + public string CreateLiteral(object value) + { + if (value == null || value.GetType() != typeof(TimeSpan)) + { + return _code.CreateLiteral(value); + } + + return string.Format(CultureInfo.InvariantCulture, "new TimeSpan({0})", ((TimeSpan)value).Ticks); + } + + public bool VerifyCaseInsensitiveTypeUniqueness(IEnumerable types, string sourceFile) + { + ArgumentNotNull(types, "types"); + ArgumentNotNull(sourceFile, "sourceFile"); + + var hash = new HashSet(StringComparer.InvariantCultureIgnoreCase); + if (types.Any(item => !hash.Add(item))) + { + _errors.Add( + new CompilerError(sourceFile, -1, -1, "6023", + String.Format(CultureInfo.CurrentCulture, CodeGenerationTools.GetResourceString("Template_CaseInsensitiveTypeConflict")))); + return false; + } + return true; + } + + public IEnumerable GetEnumItemsToGenerate(IEnumerable itemCollection) + { + return GetItemsToGenerate(itemCollection) + .Where(e => IsEnumType(e)); + } + + public IEnumerable GetItemsToGenerate(IEnumerable itemCollection) where T: EdmType + { + return itemCollection + .OfType() + .Where(i => !i.MetadataProperties.Any(p => p.Name == ExternalTypeNameAttributeName)) + .OrderBy(i => i.Name); + } + + public IEnumerable GetAllGlobalItems(IEnumerable itemCollection) + { + return itemCollection + .Where(i => i is EntityType || i is ComplexType || i is EntityContainer || IsEnumType(i)) + .Select(g => GetGlobalItemName(g)); + } + + public string GetGlobalItemName(GlobalItem item) + { + if (item is EdmType) + { + return ((EdmType)item).Name; + } + else + { + return ((EntityContainer)item).Name; + } + } + + public IEnumerable GetSimpleProperties(EntityType type) + { + return type.Properties.Where(p => p.TypeUsage.EdmType is SimpleType && p.DeclaringType == type); + } + + public IEnumerable GetSimpleProperties(ComplexType type) + { + return type.Properties.Where(p => p.TypeUsage.EdmType is SimpleType && p.DeclaringType == type); + } + + public IEnumerable GetComplexProperties(EntityType type) + { + return type.Properties.Where(p => p.TypeUsage.EdmType is ComplexType && p.DeclaringType == type); + } + + public IEnumerable GetComplexProperties(ComplexType type) + { + return type.Properties.Where(p => p.TypeUsage.EdmType is ComplexType && p.DeclaringType == type); + } + + public IEnumerable GetPropertiesWithDefaultValues(EntityType type) + { + return type.Properties.Where(p => p.TypeUsage.EdmType is SimpleType && p.DeclaringType == type && p.DefaultValue != null); + } + + public IEnumerable GetPropertiesWithDefaultValues(ComplexType type) + { + return type.Properties.Where(p => p.TypeUsage.EdmType is SimpleType && p.DeclaringType == type && p.DefaultValue != null); + } + + public IEnumerable GetNavigationProperties(EntityType type) + { + return type.NavigationProperties.Where(np => np.DeclaringType == type); + } + + public IEnumerable GetCollectionNavigationProperties(EntityType type) + { + return type.NavigationProperties.Where(np => np.DeclaringType == type && np.ToEndMember.RelationshipMultiplicity == RelationshipMultiplicity.Many); + } + + public FunctionParameter GetReturnParameter(EdmFunction edmFunction) + { + ArgumentNotNull(edmFunction, "edmFunction"); + + var returnParamsProperty = edmFunction.GetType().GetProperty("ReturnParameters"); + return returnParamsProperty == null + ? edmFunction.ReturnParameter + : ((IEnumerable)returnParamsProperty.GetValue(edmFunction, null)).FirstOrDefault(); + } + + public bool IsComposable(EdmFunction edmFunction) + { + ArgumentNotNull(edmFunction, "edmFunction"); + + var isComposableProperty = edmFunction.GetType().GetProperty("IsComposableAttribute"); + return isComposableProperty != null && (bool)isComposableProperty.GetValue(edmFunction, null); + } + + public IEnumerable GetParameters(EdmFunction edmFunction) + { + return FunctionImportParameter.Create(edmFunction.Parameters, _code, _ef); + } + + public TypeUsage GetReturnType(EdmFunction edmFunction) + { + var returnParam = GetReturnParameter(edmFunction); + return returnParam == null ? null : _ef.GetElementType(returnParam.TypeUsage); + } + + public bool GenerateMergeOptionFunction(EdmFunction edmFunction, bool includeMergeOption) + { + var returnType = GetReturnType(edmFunction); + return !includeMergeOption && returnType != null && returnType.EdmType.BuiltInTypeKind == BuiltInTypeKind.EntityType; + } +} + +public static void ArgumentNotNull(T arg, string name) where T : class +{ + if (arg == null) + { + throw new ArgumentNullException(name); + } +} +#> \ No newline at end of file diff --git a/Gordon360/Models/NEWS_CATEGORIES_Result.cs b/Gordon360/Models/NEWS_CATEGORIES_Result.cs new file mode 100644 index 000000000..ed93957fd --- /dev/null +++ b/Gordon360/Models/NEWS_CATEGORIES_Result.cs @@ -0,0 +1,20 @@ +//------------------------------------------------------------------------------ +// +// This code was generated from a template. +// +// Manual changes to this file may cause unexpected behavior in your application. +// Manual changes to this file will be overwritten if the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace Gordon360.Models +{ + using System; + + public partial class NEWS_CATEGORIES_Result + { + public int categoryID { get; set; } + public string categoryName { get; set; } + public Nullable SortOrder { get; set; } + } +} diff --git a/Gordon360/Models/NEWS_NEW_Result.cs b/Gordon360/Models/NEWS_NEW_Result.cs new file mode 100644 index 000000000..b3456104b --- /dev/null +++ b/Gordon360/Models/NEWS_NEW_Result.cs @@ -0,0 +1,28 @@ +//------------------------------------------------------------------------------ +// +// This code was generated from a template. +// +// Manual changes to this file may cause unexpected behavior in your application. +// Manual changes to this file will be overwritten if the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace Gordon360.Models +{ + using System; + + public partial class NEWS_NEW_Result + { + public int SNID { get; set; } + public string ADUN { get; set; } + public int categoryID { get; set; } + public string Subject { get; set; } + public string Body { get; set; } + public Nullable Sent { get; set; } + public Nullable thisPastMailing { get; set; } + public Nullable Entered { get; set; } + public string categoryName { get; set; } + public Nullable SortOrder { get; set; } + public Nullable ManualExpirationDate { get; set; } + } +} diff --git a/Gordon360/Models/NEWS_NOT_EXPIRED_Result.cs b/Gordon360/Models/NEWS_NOT_EXPIRED_Result.cs new file mode 100644 index 000000000..9cf000e6a --- /dev/null +++ b/Gordon360/Models/NEWS_NOT_EXPIRED_Result.cs @@ -0,0 +1,28 @@ +//------------------------------------------------------------------------------ +// +// This code was generated from a template. +// +// Manual changes to this file may cause unexpected behavior in your application. +// Manual changes to this file will be overwritten if the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace Gordon360.Models +{ + using System; + + public partial class NEWS_NOT_EXPIRED_Result + { + public int SNID { get; set; } + public string ADUN { get; set; } + public int categoryID { get; set; } + public string Subject { get; set; } + public string Body { get; set; } + public Nullable Sent { get; set; } + public Nullable thisPastMailing { get; set; } + public Nullable Entered { get; set; } + public string categoryName { get; set; } + public Nullable SortOrder { get; set; } + public Nullable ManualExpirationDate { get; set; } + } +} diff --git a/Gordon360/Models/StudentNews.cs b/Gordon360/Models/StudentNews.cs new file mode 100644 index 000000000..49076ecc7 --- /dev/null +++ b/Gordon360/Models/StudentNews.cs @@ -0,0 +1,32 @@ +//------------------------------------------------------------------------------ +// +// This code was generated from a template. +// +// Manual changes to this file may cause unexpected behavior in your application. +// Manual changes to this file will be overwritten if the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace Gordon360.Models +{ + using System; + using System.Collections.Generic; + + public partial class StudentNews + { + public int SNID { get; set; } + public string ADUN { get; set; } + public int categoryID { get; set; } + public string Subject { get; set; } + public string Body { get; set; } + public Nullable Accepted { get; set; } + public Nullable Sent { get; set; } + public Nullable thisPastMailing { get; set; } + public Nullable Entered { get; set; } + public string fname { get; set; } + public string lname { get; set; } + public Nullable ManualExpirationDate { get; set; } + + public virtual StudentNewsCategory StudentNewsCategory { get; set; } + } +} diff --git a/Gordon360/Models/StudentNewsCategory.cs b/Gordon360/Models/StudentNewsCategory.cs new file mode 100644 index 000000000..69af1aff3 --- /dev/null +++ b/Gordon360/Models/StudentNewsCategory.cs @@ -0,0 +1,30 @@ +//------------------------------------------------------------------------------ +// +// This code was generated from a template. +// +// Manual changes to this file may cause unexpected behavior in your application. +// Manual changes to this file will be overwritten if the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace Gordon360.Models +{ + using System; + using System.Collections.Generic; + + public partial class StudentNewsCategory + { + [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2214:DoNotCallOverridableMethodsInConstructors")] + public StudentNewsCategory() + { + this.StudentNews = new HashSet(); + } + + public int categoryID { get; set; } + public string categoryName { get; set; } + public Nullable SortOrder { get; set; } + + [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")] + public virtual ICollection StudentNews { get; set; } + } +} diff --git a/Gordon360/Models/StudentNewsExpiration.cs b/Gordon360/Models/StudentNewsExpiration.cs new file mode 100644 index 000000000..028b8d2dc --- /dev/null +++ b/Gordon360/Models/StudentNewsExpiration.cs @@ -0,0 +1,20 @@ +//------------------------------------------------------------------------------ +// +// This code was generated from a template. +// +// Manual changes to this file may cause unexpected behavior in your application. +// Manual changes to this file will be overwritten if the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace Gordon360.Models +{ + using System; + using System.Collections.Generic; + + public partial class StudentNewsExpiration + { + public int SNID { get; set; } + public Nullable ManualExpirationDate { get; set; } + } +} diff --git a/Gordon360/Models/UPCOMING_RIDES_BY_STUDENT_ID_Result.cs b/Gordon360/Models/UPCOMING_RIDES_BY_STUDENT_ID_Result.cs index da99040b3..c5b6d5d4b 100644 --- a/Gordon360/Models/UPCOMING_RIDES_BY_STUDENT_ID_Result.cs +++ b/Gordon360/Models/UPCOMING_RIDES_BY_STUDENT_ID_Result.cs @@ -10,15 +10,18 @@ namespace Gordon360.Models { using System; - + public partial class UPCOMING_RIDES_BY_STUDENT_ID_Result { public string rideID { get; set; } public int capacity { get; set; } public string destination { get; set; } public string meetingPoint { get; set; } - public System.DateTime startPoint { get; set; } + public System.DateTime startTime { get; set; } public System.DateTime endTime { get; set; } public byte isCanceled { get; set; } + public string notes { get; set; } + public byte isDriver { get; set; } + public Nullable seatsTaken { get; set; } } } diff --git a/Gordon360/Models/UPCOMING_RIDES_Result.cs b/Gordon360/Models/UPCOMING_RIDES_Result.cs index 91ac7e493..09c2e515b 100644 --- a/Gordon360/Models/UPCOMING_RIDES_Result.cs +++ b/Gordon360/Models/UPCOMING_RIDES_Result.cs @@ -10,16 +10,18 @@ namespace Gordon360.Models { using System; - + public partial class UPCOMING_RIDES_Result { public string rideID { get; set; } + public int capacity { get; set; } public string destination { get; set; } public string meetingPoint { get; set; } public System.DateTime startTime { get; set; } public System.DateTime endTime { get; set; } - public int capacity { get; set; } + public byte isCanceled { get; set; } public string notes { get; set; } - public byte canceled { get; set; } + public byte isDriver { get; set; } + public Nullable seatsTaken { get; set; } } } diff --git a/Gordon360/Models/ViewModels/ClockInViewModel.cs b/Gordon360/Models/ViewModels/ClockInViewModel.cs new file mode 100644 index 000000000..91aa31664 --- /dev/null +++ b/Gordon360/Models/ViewModels/ClockInViewModel.cs @@ -0,0 +1,16 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Web; + +namespace Gordon360.Models.ViewModels +{ + public class ClockInViewModel + { + //is true if user has clocked in and false if user is going to clock out + public bool currentState { get; set; } + + //time of when when user clocked in + public DateTime timestamp { get; set; } + } +} diff --git a/Gordon360/Models/ViewModels/RideViewModel.cs b/Gordon360/Models/ViewModels/RideViewModel.cs index aa9e5b07d..c04734a1a 100644 --- a/Gordon360/Models/ViewModels/RideViewModel.cs +++ b/Gordon360/Models/ViewModels/RideViewModel.cs @@ -35,4 +35,4 @@ public static implicit operator RideViewModel(Save_Rides ride) return vm; } } -} \ No newline at end of file +} diff --git a/Gordon360/Models/ViewModels/StaffTimesheetsViewModel.cs b/Gordon360/Models/ViewModels/StaffTimesheetsViewModel.cs new file mode 100644 index 000000000..d8065203a --- /dev/null +++ b/Gordon360/Models/ViewModels/StaffTimesheetsViewModel.cs @@ -0,0 +1,30 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Web; + +namespace Gordon360.Models.ViewModels +{ + public class StaffTimesheetsViewModel + { + public int ID { get; set; } + public int ID_NUM { get; set; } + public int EML { get; set; } + public string EML_DESCRIPTION { get; set; } + public System.DateTime SHIFT_START_DATETIME { get; set; } + public System.DateTime SHIFT_END_DATETIME { get; set; } + public decimal HOURLY_RATE { get; set; } + public decimal HOURS_WORKED { get; set; } + public int SUPERVISOR { get; set; } + public int COMP_SUPERVISOR { get; set; } + public string STATUS { get; set; } + public Nullable SUBMITTED_TO { get; set; } + public string SHIFT_NOTES { get; set; } + public string COMMENTS { get; set; } + public Nullable PAY_WEEK_DATE { get; set; } + public Nullable PAY_PERIOD_DATE { get; set; } + public Nullable PAY_PERIOD_ID { get; set; } + public string LAST_CHANGED_BY { get; set; } + public System.DateTime DATETIME_ENTERED { get; set; } + } +} \ No newline at end of file diff --git a/Gordon360/Models/ViewModels/StudentNewsCategoryViewModel.cs b/Gordon360/Models/ViewModels/StudentNewsCategoryViewModel.cs new file mode 100644 index 000000000..2fbaf9944 --- /dev/null +++ b/Gordon360/Models/ViewModels/StudentNewsCategoryViewModel.cs @@ -0,0 +1,26 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Web; + +namespace Gordon360.Models.ViewModels +{ + public class StudentNewsCategoryViewModel + { + public int categoryID { get; set; } + public string categoryName { get; set; } + public Nullable SortOrder { get; set; } + + public static implicit operator StudentNewsCategoryViewModel(StudentNewsCategory c) + { + StudentNewsCategoryViewModel vm = new StudentNewsCategoryViewModel + { + categoryID = c.categoryID, + categoryName = c.categoryName, + SortOrder = c.SortOrder, + }; + + return vm; + } + } +} \ No newline at end of file diff --git a/Gordon360/Models/ViewModels/StudentNewsViewModel.cs b/Gordon360/Models/ViewModels/StudentNewsViewModel.cs new file mode 100644 index 000000000..8f10cce10 --- /dev/null +++ b/Gordon360/Models/ViewModels/StudentNewsViewModel.cs @@ -0,0 +1,51 @@ +/******************************** + * This file is manually created and may be edited + * The view model allows access to all of the model's data without + * anything unnecessary. It prevents a self-referencing loop error + * in models that need a category that need a model etc. + * The implicit operator allows conversion between the model and the view model + ********************************/ + +using System; + +namespace Gordon360.Models.ViewModels +{ + public class StudentNewsViewModel + { + public int SNID { get; set; } + public string ADUN { get; set; } + public int categoryID { get; set; } + public string Subject { get; set; } + public string Body { get; set; } + // defaults below to unapproved (if null), hence not a nullable bool + public bool Accepted { get; set; } + public Nullable Sent { get; set; } + public Nullable thisPastMailing { get; set; } + public Nullable Entered { get; set; } + public string categoryName { get; set; } + public Nullable SortOrder { get; set; } + public Nullable ManualExpirationDate { get; set; } + + public static implicit operator StudentNewsViewModel(StudentNews n) + { + StudentNewsViewModel vm = new StudentNewsViewModel + { + SNID = n.SNID, + ADUN = n.ADUN, + categoryID = n.categoryID, + Subject = n.Subject, + Body = n.Body, + // should default to unapproved (if null) + Accepted = n.Accepted ?? false, + Sent = n.Sent, + thisPastMailing = n.thisPastMailing, + Entered = n.Entered, + categoryName = n.StudentNewsCategory.categoryName, + SortOrder = n.StudentNewsCategory.SortOrder, + ManualExpirationDate = n.ManualExpirationDate, + }; + + return vm; + } + } +} \ No newline at end of file diff --git a/Gordon360/Models/ViewModels/WellnessQuestionViewModel.cs b/Gordon360/Models/ViewModels/WellnessQuestionViewModel.cs new file mode 100644 index 000000000..0cb58f9f1 --- /dev/null +++ b/Gordon360/Models/ViewModels/WellnessQuestionViewModel.cs @@ -0,0 +1,16 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Web; + +namespace Gordon360.Models.ViewModels +{ + public class WellnessQuestionViewModel + { + public String question { get; set; } //question to the wellness check from back end + + public String yesPrompt { get; set; } //prompt that pops up if answer to question is yes + + public String noPrompt { get; set; } //prompt that pops up if answer to question is no + } +} \ No newline at end of file diff --git a/Gordon360/Models/ViewModels/WellnessViewModel.cs b/Gordon360/Models/ViewModels/WellnessViewModel.cs new file mode 100644 index 000000000..2c3add879 --- /dev/null +++ b/Gordon360/Models/ViewModels/WellnessViewModel.cs @@ -0,0 +1,22 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Web; + +namespace Gordon360.Models.ViewModels +{ + public class WellnessViewModel + { + //returns true if last answered question is still valid + public Nullable answerValid { get; set; } + + //user's answer to wellness question. either true or false. + // True: "I am symptomatic" + // false: "I am not symptomatic" + public Nullable userAnswer { get; set; } + + //time stamp of when user last answered the wellness question + public DateTime timestamp { get; set; } + + } +} \ No newline at end of file diff --git a/Gordon360/Models/dt_getpropertiesbyid_Result.cs b/Gordon360/Models/dt_getpropertiesbyid_Result.cs new file mode 100644 index 000000000..9de601aa8 --- /dev/null +++ b/Gordon360/Models/dt_getpropertiesbyid_Result.cs @@ -0,0 +1,21 @@ +//------------------------------------------------------------------------------ +// +// This code was generated from a template. +// +// Manual changes to this file may cause unexpected behavior in your application. +// Manual changes to this file will be overwritten if the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace Gordon360.Models +{ + using System; + + public partial class dt_getpropertiesbyid_Result + { + public string property { get; set; } + public int version { get; set; } + public string value { get; set; } + public byte[] lvalue { get; set; } + } +} diff --git a/Gordon360/Models/dt_getpropertiesbyid_u_Result.cs b/Gordon360/Models/dt_getpropertiesbyid_u_Result.cs new file mode 100644 index 000000000..b2411aefc --- /dev/null +++ b/Gordon360/Models/dt_getpropertiesbyid_u_Result.cs @@ -0,0 +1,21 @@ +//------------------------------------------------------------------------------ +// +// This code was generated from a template. +// +// Manual changes to this file may cause unexpected behavior in your application. +// Manual changes to this file will be overwritten if the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace Gordon360.Models +{ + using System; + + public partial class dt_getpropertiesbyid_u_Result + { + public string property { get; set; } + public int version { get; set; } + public string uvalue { get; set; } + public byte[] lvalue { get; set; } + } +} diff --git a/Gordon360/Models/dtproperties.cs b/Gordon360/Models/dtproperties.cs new file mode 100644 index 000000000..e9fabd2b9 --- /dev/null +++ b/Gordon360/Models/dtproperties.cs @@ -0,0 +1,25 @@ +//------------------------------------------------------------------------------ +// +// This code was generated from a template. +// +// Manual changes to this file may cause unexpected behavior in your application. +// Manual changes to this file will be overwritten if the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace Gordon360.Models +{ + using System; + using System.Collections.Generic; + + public partial class dtproperties + { + public int id { get; set; } + public Nullable objectid { get; set; } + public string property { get; set; } + public string value { get; set; } + public string uvalue { get; set; } + public byte[] lvalue { get; set; } + public int version { get; set; } + } +} diff --git a/Gordon360/Models/sp_helpdiagramdefinition_Result.cs b/Gordon360/Models/sp_helpdiagramdefinition_Result.cs index 96a056100..c4b9a511a 100644 --- a/Gordon360/Models/sp_helpdiagramdefinition_Result.cs +++ b/Gordon360/Models/sp_helpdiagramdefinition_Result.cs @@ -16,4 +16,4 @@ public partial class sp_helpdiagramdefinition_Result public Nullable version { get; set; } public byte[] definition { get; set; } } -} \ No newline at end of file +} diff --git a/Gordon360/Models/sp_helpdiagrams_Result.cs b/Gordon360/Models/sp_helpdiagrams_Result.cs index cb771770d..cf9a06ff3 100644 --- a/Gordon360/Models/sp_helpdiagrams_Result.cs +++ b/Gordon360/Models/sp_helpdiagrams_Result.cs @@ -19,4 +19,4 @@ public partial class sp_helpdiagrams_Result public string Owner { get; set; } public int OwnerID { get; set; } } -} \ No newline at end of file +} diff --git a/Gordon360/Models/sysdiagrams.cs b/Gordon360/Models/sysdiagrams.cs index b8c32e4bf..8cd8aff7f 100644 --- a/Gordon360/Models/sysdiagrams.cs +++ b/Gordon360/Models/sysdiagrams.cs @@ -20,4 +20,4 @@ public partial class sysdiagrams public Nullable version { get; set; } public byte[] definition { get; set; } } -} \ No newline at end of file +} diff --git a/Gordon360/Models/view_cct_ChapelEvent.cs b/Gordon360/Models/view_cct_ChapelEvent.cs new file mode 100644 index 000000000..e69b79e3f --- /dev/null +++ b/Gordon360/Models/view_cct_ChapelEvent.cs @@ -0,0 +1,31 @@ +//------------------------------------------------------------------------------ +// +// This code was generated from a template. +// +// Manual changes to this file may cause unexpected behavior in your application. +// Manual changes to this file will be overwritten if the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace Gordon360.Models +{ + using System; + using System.Collections.Generic; + + public partial class view_cct_ChapelEvent + { + public int ROWID { get; set; } + public string CHBarEventID { get; set; } + public int ID_NUM { get; set; } + public string CHBarcode { get; set; } + public string CHEventID { get; set; } + public string CHCheckerID { get; set; } + public Nullable CHDate { get; set; } + public Nullable CHTime { get; set; } + public string CHSource { get; set; } + public string CHTermCD { get; set; } + public Nullable Attended { get; set; } + public Nullable Required { get; set; } + public Nullable LiveID { get; set; } + } +} diff --git a/Gordon360/Models/view_cct_alumni.cs b/Gordon360/Models/view_cct_alumni.cs new file mode 100644 index 000000000..e82e1b56b --- /dev/null +++ b/Gordon360/Models/view_cct_alumni.cs @@ -0,0 +1,51 @@ +//------------------------------------------------------------------------------ +// +// This code was generated from a template. +// +// Manual changes to this file may cause unexpected behavior in your application. +// Manual changes to this file will be overwritten if the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace Gordon360.Models +{ + using System; + using System.Collections.Generic; + + public partial class view_cct_alumni + { + public string ID { get; set; } + public string WebUpdate { get; set; } + public string Title { get; set; } + public string FirstName { get; set; } + public string MiddleName { get; set; } + public string LastName { get; set; } + public string Suffix { get; set; } + public string MaidenName { get; set; } + public string NickName { get; set; } + public string HomeStreet1 { get; set; } + public string HomeStreet2 { get; set; } + public string HomeCity { get; set; } + public string HomeState { get; set; } + public string HomePostalCode { get; set; } + public string HomeCountry { get; set; } + public string HomePhone { get; set; } + public string HomeFax { get; set; } + public string HomeEmail { get; set; } + public string JobTitle { get; set; } + public string MaritalStatus { get; set; } + public string SpouseName { get; set; } + public string College { get; set; } + public string ClassYear { get; set; } + public string PreferredClassYear { get; set; } + public string Major1 { get; set; } + public string Major2 { get; set; } + public string ShareName { get; set; } + public string ShareAddress { get; set; } + public string Gender { get; set; } + public string GradDate { get; set; } + public string Email { get; set; } + public string grad_student { get; set; } + public string Barcode { get; set; } + } +} diff --git a/Gordon360/Models/view_cct_facstaff.cs b/Gordon360/Models/view_cct_facstaff.cs new file mode 100644 index 000000000..865258fed --- /dev/null +++ b/Gordon360/Models/view_cct_facstaff.cs @@ -0,0 +1,48 @@ +//------------------------------------------------------------------------------ +// +// This code was generated from a template. +// +// Manual changes to this file may cause unexpected behavior in your application. +// Manual changes to this file will be overwritten if the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace Gordon360.Models +{ + using System; + using System.Collections.Generic; + + public partial class view_cct_facstaff + { + public string ID { get; set; } + public string Title { get; set; } + public string FirstName { get; set; } + public string MiddleName { get; set; } + public string LastName { get; set; } + public string Suffix { get; set; } + public string MaidenName { get; set; } + public string Nickname { get; set; } + public string OnCampusDepartment { get; set; } + public string OnCampusBuilding { get; set; } + public string OnCampusRoom { get; set; } + public string OnCampusPhone { get; set; } + public string OnCampusPrivatePhone { get; set; } + public string OnCampusFax { get; set; } + public string HomeStreet1 { get; set; } + public string HomeStreet2 { get; set; } + public string HomeCity { get; set; } + public string HomeState { get; set; } + public string HomePostalCode { get; set; } + public string HomeCountry { get; set; } + public string HomePhone { get; set; } + public string HomeFax { get; set; } + public string KeepPrivate { get; set; } + public string JobTitle { get; set; } + public string SpouseName { get; set; } + public string Dept { get; set; } + public string Barcode { get; set; } + public string Gender { get; set; } + public string Email { get; set; } + public string Type { get; set; } + } +} diff --git a/Gordon360/Models/view_cct_student.cs b/Gordon360/Models/view_cct_student.cs new file mode 100644 index 000000000..a4dbaafce --- /dev/null +++ b/Gordon360/Models/view_cct_student.cs @@ -0,0 +1,67 @@ +//------------------------------------------------------------------------------ +// +// This code was generated from a template. +// +// Manual changes to this file may cause unexpected behavior in your application. +// Manual changes to this file will be overwritten if the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace Gordon360.Models +{ + using System; + using System.Collections.Generic; + + public partial class view_cct_student + { + public string ID { get; set; } + public string Title { get; set; } + public string FirstName { get; set; } + public string MiddleName { get; set; } + public string LastName { get; set; } + public string Suffix { get; set; } + public string MaidenName { get; set; } + public string NickName { get; set; } + public string OnOffCampus { get; set; } + public string OnCampusBuilding { get; set; } + public string OnCampusRoom { get; set; } + public string OnCampusPhone { get; set; } + public string OnCampusPrivatePhone { get; set; } + public string OnCampusFax { get; set; } + public string OffCampusStreet1 { get; set; } + public string OffCampusStreet2 { get; set; } + public string OffCampusCity { get; set; } + public string OffCampusState { get; set; } + public string OffCampusPostalCode { get; set; } + public string OffCampusCountry { get; set; } + public string OffCampusPhone { get; set; } + public string OffCampusFax { get; set; } + public string HomeStreet1 { get; set; } + public string HomeStreet2 { get; set; } + public string HomeCity { get; set; } + public string HomeState { get; set; } + public string HomePostalCode { get; set; } + public string HomeCountry { get; set; } + public string HomePhone { get; set; } + public string HomeFax { get; set; } + public string Cohort { get; set; } + public string Class { get; set; } + public string KeepPrivate { get; set; } + public string Major { get; set; } + public string Barcode { get; set; } + public string AdvisorIDs { get; set; } + public string Married { get; set; } + public string Commuter { get; set; } + public string Major2 { get; set; } + public string Email { get; set; } + public string Gender { get; set; } + public string grad_student { get; set; } + public Nullable GradDate { get; set; } + public string Major3 { get; set; } + public string Minor1 { get; set; } + public string Minor2 { get; set; } + public string Minor3 { get; set; } + public string MobilePhone { get; set; } + public int IsMobilePhonePrivate { get; set; } + } +} diff --git a/Gordon360/Repositories/GenericRepository.cs b/Gordon360/Repositories/GenericRepository.cs index 8562a893b..0cc0a44e1 100644 --- a/Gordon360/Repositories/GenericRepository.cs +++ b/Gordon360/Repositories/GenericRepository.cs @@ -15,6 +15,7 @@ public class GenericRepository : IRepository where T: class /// The database context for the repository /// private readonly CCTEntities1 _context; + private readonly MyGordonEntities _myGordonCtx; /// /// The data set of the repository @@ -31,6 +32,16 @@ public GenericRepository(CCTEntities1 context) _dbSet = _context.Set(); } + /// + /// Initializes a new instance of the class. + /// + /// The context for the repository + public GenericRepository(MyGordonEntities context) + { + _myGordonCtx = context; + _dbSet = _myGordonCtx.Set(); + } + /// /// Gets single entity by id /// diff --git a/Gordon360/Repositories/IUnitOfWork.cs b/Gordon360/Repositories/IUnitOfWork.cs index 24d0b6fbe..5be126bd7 100644 --- a/Gordon360/Repositories/IUnitOfWork.cs +++ b/Gordon360/Repositories/IUnitOfWork.cs @@ -3,6 +3,7 @@ using System.Linq; using System.Web; using Gordon360.Models; +using Gordon360.Models.ViewModels; namespace Gordon360.Repositories { @@ -38,6 +39,9 @@ public interface IUnitOfWork IRepository VictoryPromiseByStudentIDRepository { get; } //IRepository StudentEmploymentByStudentIDRepository { get; } + IRepository StudentNewsRepository { get; } + IRepository StudentNewsCategoryRepository { get; } + bool Save(); diff --git a/Gordon360/Repositories/UnitOfWork.cs b/Gordon360/Repositories/UnitOfWork.cs index e8ad7ee5f..3a7ff53ec 100644 --- a/Gordon360/Repositories/UnitOfWork.cs +++ b/Gordon360/Repositories/UnitOfWork.cs @@ -1,4 +1,5 @@ -using System; +using Gordon360.Models.ViewModels; +using System; using System.Collections.Generic; using System.Linq; using System.Web; @@ -36,12 +37,16 @@ public class UnitOfWork : IUnitOfWork private IRepository _DiningInfoRepository; private IRepository _ErrorLogRepository; private IRepository _ScheduleControlRepository; + private IRepository _StudentNewsRepository; + private IRepository _StudentNewsCategoryRepository; private CCTEntities1 _context; + private MyGordonEntities _myGordonCtx; public UnitOfWork() { _context = new CCTEntities1(); + _myGordonCtx = new MyGordonEntities(); } public IRepository StudentRepository { @@ -105,7 +110,7 @@ IRepository IUnitOfWork.ActivityPerSessionRepos { get { - return _ActivityPerSessionRepository ?? (_ActivityPerSessionRepository = new GenericRepository(_context)); + return _ActivityPerSessionRepository ?? (_ActivityPerSessionRepository = new GenericRepository(_context)); } } IRepository IUnitOfWork.VictoryPromiseByStudentIDRepository @@ -115,13 +120,13 @@ IRepository IUnitOfWork.VictoryPromiseBySt return _VictoryPromiseByStudentIDRepository ?? (_VictoryPromiseByStudentIDRepository = new GenericRepository(_context)); } } - //IRepository IUnitOfWork.StudentEmploymentByStudentIDRepository - //{ - // get - // { - // return _StudentEmploymentByStudentIDRepository ?? (_StudentEmploymentByStudentIDRepository = new GenericRepository(_context)); - // } - //} + //IRepository IUnitOfWork.StudentEmploymentByStudentIDRepository + //{ + // get + // { + // return _StudentEmploymentByStudentIDRepository ?? (_StudentEmploymentByStudentIDRepository = new GenericRepository(_context)); + // } + //} public IRepository MembershipRequestRepository { get { return _MembershipRequestRepository ?? (_MembershipRequestRepository = new GenericRepository(_context)); } @@ -129,12 +134,12 @@ public IRepository MembershipRequestRepository public IRepository AdministratorRepository { - get { return _AdministratorRepository ?? (_AdministratorRepository = new GenericRepository(_context)); } + get { return _AdministratorRepository ?? (_AdministratorRepository = new GenericRepository(_context)); } } public IRepository SliderRepository { - get { return _SliderRepository ?? (_SliderRepository = new GenericRepository(_context)); } + get { return _SliderRepository ?? (_SliderRepository = new GenericRepository(_context)); } } public IRepository ChapelEventRepository { @@ -152,6 +157,14 @@ public IRepository ErrorLogRepository { get { return _ErrorLogRepository ?? (_ErrorLogRepository = new GenericRepository(_context)); } } + public IRepository StudentNewsRepository + { + get { return _StudentNewsRepository ?? (_StudentNewsRepository = new GenericRepository(_myGordonCtx)); } + } + public IRepository StudentNewsCategoryRepository + { + get { return _StudentNewsCategoryRepository ?? (_StudentNewsCategoryRepository = new GenericRepository(_myGordonCtx)); } + } public IRepository RideRepository { get { return _RideRepository ?? (_RideRepository = new GenericRepository(_context)); } @@ -167,6 +180,7 @@ public bool Save() try { _context.SaveChanges(); + _myGordonCtx.SaveChanges(); } catch (DbEntityValidationException ex) { @@ -191,4 +205,4 @@ public bool Save() } } -} \ No newline at end of file +} diff --git a/Gordon360/Services/ComplexQueries/RawSqlQuery.cs b/Gordon360/Services/ComplexQueries/RawSqlQuery.cs index a6dc29b7d..77e1ec768 100644 --- a/Gordon360/Services/ComplexQueries/RawSqlQuery.cs +++ b/Gordon360/Services/ComplexQueries/RawSqlQuery.cs @@ -15,7 +15,7 @@ public static class RawSqlQuery where T: class /// /// Execute the sql query /// - /// An sql statment. Can be a stored procedure or even a simple SELECT statment + /// An sql statement. Can be a stored procedure or even a simple SELECT statement /// Parameters to pass into the stored procedure /// public static IEnumerable query(string query, params object[] parameters) @@ -30,7 +30,7 @@ public static IEnumerable query(string query, params object[] parameters) /// /// Execute the sql query on the StudentTimesheets database /// - /// An sql statment. Can be a stored procedure or even a simple SELECT statment + /// An sql statement. Can be a stored procedure or even a simple SELECT statment /// Parameters to pass into the stored procedure /// public static IEnumerable StudentTimesheetQuery(string query, params object[] parameters) @@ -42,4 +42,4 @@ public static IEnumerable StudentTimesheetQuery(string query, params object[] } } } -} \ No newline at end of file +} diff --git a/Gordon360/Services/JobsService.cs b/Gordon360/Services/JobsService.cs index b3584de3a..5b4929b09 100644 --- a/Gordon360/Services/JobsService.cs +++ b/Gordon360/Services/JobsService.cs @@ -205,5 +205,284 @@ public IEnumerable checkForOverlappingShift(int stu return result; } + + + public ClockInViewModel ClockIn(bool state, string id) + { + + var _unitOfWork = new UnitOfWork(); + var query = _unitOfWork.AccountRepository.FirstOrDefault(x => x.gordon_id == id); + if (query == null) + { + throw new ResourceNotFoundException() { ExceptionMessage = "The account was not found." }; + } + + var idParam = new SqlParameter("@ID_Num", id); + var stateParam = new SqlParameter("@CurrentState", state); + + var result = RawSqlQuery.query("INSERT_TIMESHEETS_CLOCK_IN_OUT @ID_Num, @CurrentState", idParam, stateParam); //run stored procedure + if (result == null) + { + throw new ResourceNotFoundException() { ExceptionMessage = "The data was not found." }; + } + + var currentState = state; + + ClockInViewModel y = new ClockInViewModel() + { + currentState = currentState + }; + + return y; + } + + public IEnumerable ClockOut(string id ) + { + var _unitOfWork = new UnitOfWork(); + var query = _unitOfWork.AccountRepository.FirstOrDefault(x => x.gordon_id == id); + if (query == null) + { + throw new ResourceNotFoundException() { ExceptionMessage = "The account was not found." }; + } + + var idParam = new SqlParameter("@ID_Num", id); + + var result = RawSqlQuery.query("GET_TIMESHEETS_CLOCK_IN_OUT @ID_NUM", idParam); //run stored procedure + + + if (result == null) + { + throw new ResourceNotFoundException() { ExceptionMessage = "The data was not found." }; + } + + + var clockOutModel = result.Select(x => + { + ClockInViewModel y = new ClockInViewModel(); + + y.currentState = x.currentState; + + y.timestamp = x.timestamp; + + + return y; + }); + + + + return clockOutModel; + + } + + public ClockInViewModel DeleteClockIn(string id) + { + var _unitOfWork = new UnitOfWork(); + var query = _unitOfWork.AccountRepository.FirstOrDefault(x => x.gordon_id == id); + if (query == null) + { + throw new ResourceNotFoundException() { ExceptionMessage = "The account was not found." }; + } + + var idParam = new SqlParameter("@ID_Num", id); + + var result = RawSqlQuery.query("DELETE_CLOCK_IN @ID_NUM", idParam); //run stored procedure + + + if (result == null) + { + throw new ResourceNotFoundException() { ExceptionMessage = "The data was not found." }; + } + + + + ClockInViewModel y = new ClockInViewModel(); + + return y; + + } + + //staff functions + + public IEnumerable saveShiftForStaff(int staffID, int jobID, DateTime shiftStart, DateTime shiftEnd, string hoursWorked, string shiftNotes, string lastChangedBy) + { + IEnumerable result = null; + + var id_num = new SqlParameter("@ID_NUM", staffID); + var eml = new SqlParameter("@eml", jobID); + var shiftStartDateTime = new SqlParameter("@shift_start_datetime", shiftStart); + var shiftEndDateTime = new SqlParameter("@shift_end_datetime", shiftEnd); + var hours_worked = new SqlParameter("@hours_worked", hoursWorked); + var notes = new SqlParameter("@shift_notes", shiftNotes); + var changedBy = new SqlParameter("@last_changed_by", lastChangedBy); + + try + { + result = RawSqlQuery.query("staff_timesheets_insert_shift @ID_NUM, @eml, @shift_start_datetime, @shift_end_datetime, @hours_worked, @shift_notes, @last_changed_by", id_num, eml, shiftStartDateTime, shiftEndDateTime, hours_worked, notes, changedBy); + } + catch (Exception e) + { + Debug.WriteLine(e.Message); + } + + return result; + } + + + public IEnumerable getSavedShiftsForStaff(int ID_NUM) + { + IEnumerable result = null; + + var id_num = new SqlParameter("@ID_NUM", ID_NUM); + string query = "SELECT ID_NUM, EML, EML_DESCRIPTION, SHIFT_START_DATETIME, SHIFT_END_DATETIME, HOURLY_RATE, HOURS_WORKED, SUPERVISOR, COMP_SUPERVISOR, STATUS, SUBMITTED_TO, SHIFT_NOTES, COMMENTS, PAY_WEEK_DATE, PAY_PERIOD_DATE, PAY_PERIOD_ID, LAST_CHANGED_BY, DATETIME_ENTERED from staff_timesheets where ID_NUM = @ID_NUM AND STATUS != 'Paid' order by EML, SHIFT_START_DATETIME, STATUS"; + try + { + result = RawSqlQuery.query(query, id_num); + } + catch (Exception e) + { + Debug.WriteLine(e.Message); + } + + return result; + } + + public IEnumerable editShiftStaff(int rowID, DateTime shiftStart, DateTime shiftEnd, string hoursWorked, string username) + { + IEnumerable result = null; + var id = new SqlParameter("@ID", rowID); + var newStart = new SqlParameter("@newStart", shiftStart); + var newEnd = new SqlParameter("@newEnd", shiftEnd); + var newHours = new SqlParameter("@newHours", hoursWorked); + var lastChangedBy = new SqlParameter("@lastChangedBy", username); + + try + { + result = RawSqlQuery.query("UPDATE staff_timesheets SET STATUS = 'Saved', SHIFT_START_DATETIME = @newStart, SHIFT_END_DATETIME = @newEnd, HOURS_WORKED = @newHours, LAST_CHANGED_BY = @lastChangedBy, COMMENTS = null WHERE ID = @ID;", newStart, newEnd, newHours, id, lastChangedBy); + } + catch (Exception e) + { + Debug.WriteLine(e.Message); + } + + return result; + } + + public IEnumerable deleteShiftForStaff(int rowID, int staffID) + { + IEnumerable result = null; + + var row_id = new SqlParameter("@row_num", rowID); + var ID_NUM = new SqlParameter("@ID_NUM", staffID); + + try + { + result = RawSqlQuery.query("staff_timesheets_delete_shift @row_num, @ID_NUM", row_id, ID_NUM); + } + catch (Exception e) + { + Debug.WriteLine(e.Message); + } + + return result; + } + + public IEnumerable submitShiftForStaff(int staffID, int jobID, DateTime shiftEnd, int submittedTo, string lastChangedBy) + { + IEnumerable result = null; + + var ID_NUM = new SqlParameter("@ID_NUM", staffID); + var eml = new SqlParameter("@eml", jobID); + var shiftEndDateTime = new SqlParameter("@shift_end_datetime", shiftEnd); + var submitted_to = new SqlParameter("@submitted_to", submittedTo); + var changedBy = new SqlParameter("@last_changed_by", lastChangedBy); + + try + { + result = RawSqlQuery.query("staff_timesheets_submit_job_shift @ID_NUM, @eml, @shift_end_datetime, @submitted_to, @last_changed_by", ID_NUM, eml, shiftEndDateTime, submitted_to, changedBy); + } + catch (Exception e) + { + Debug.WriteLine(e.Message); + } + + return result; + } + + public IEnumerable getActiveJobsStaff(DateTime shiftStart, DateTime shiftEnd, int staffID) + { + IEnumerable result = null; + + var start_datetime = new SqlParameter("@start_datetime", shiftStart); + var end_datetime = new SqlParameter("@end_datetime", shiftEnd); + var id_num = new SqlParameter("@ID_NUM", staffID); + + try + { + result = RawSqlQuery.query("staff_timesheets_select_emls_for_ajax_selectbox @start_datetime, @end_datetime, @ID_NUM", start_datetime, end_datetime, id_num); + } + catch (Exception e) + { + Debug.WriteLine(e.Message); + } + + return result; + } + + public IEnumerable getStaffSupervisorNameForJob(int supervisorID) + { + IEnumerable result = null; + + var supervisor = new SqlParameter("@supervisor", supervisorID); + + try + { + result = RawSqlQuery.query("staff_timesheets_select_supervisor_name @supervisor", supervisor); + } + catch (Exception e) + { + Debug.WriteLine(e.Message); + } + return result; + } + + public IEnumerable editShiftOverlapCheckStaff(int staffID, DateTime shiftStart, DateTime shiftEnd, int rowID) + { + IEnumerable result = null; + var id_num = new SqlParameter("@ID_NUM", staffID); + var start_datetime = new SqlParameter("@start_datetime", shiftStart); + var end_datetime = new SqlParameter("@end_datetime", shiftEnd); + var shift_being_edited = new SqlParameter("@shift_being_edited", rowID); + + try + { + result = RawSqlQuery.query("staff_timesheets_edit_shift_already_worked_these_hours @ID_NUM, @start_datetime, @end_datetime, @shift_being_edited", id_num, start_datetime, end_datetime, shift_being_edited); + } + catch (Exception e) + { + Debug.WriteLine(e.Message); + } + return result; + } + + public IEnumerable checkForOverlappingShiftStaff(int staffID, DateTime shiftStart, DateTime shiftEnd) + { + IEnumerable result = null; + + var id_num = new SqlParameter("@ID_NUM", staffID); + var start_datetime = new SqlParameter("@start_datetime", shiftStart); + var end_datetime = new SqlParameter("@end_datetime", shiftEnd); + + try + { + result = RawSqlQuery.query("staff_timesheets_already_worked_these_hours @ID_NUM, @start_datetime, @end_datetime", id_num, start_datetime, end_datetime); + } + catch (Exception e) + { + Debug.WriteLine(e.Message); + } + + return result; + } + } -} \ No newline at end of file +} diff --git a/Gordon360/Services/MembershipService.cs b/Gordon360/Services/MembershipService.cs index ba01a8dfc..8685a3567 100644 --- a/Gordon360/Services/MembershipService.cs +++ b/Gordon360/Services/MembershipService.cs @@ -75,6 +75,22 @@ public MEMBERSHIP Delete(int id) return result; } + /// + /// Fetch the membership whose id is specified by the parameter + /// + /// The membership id + /// MembershipViewModel if found, null if not found + public MEMBERSHIP GetSpecificMembership(int id) + { + MEMBERSHIP result = _unitOfWork.MembershipRepository.GetById(id); + if (result == null) + { + throw new ResourceNotFoundException() { ExceptionMessage = "The Membership was not found." }; + } + + return result; + } + /// /// Fetches all membership records from storage. /// @@ -404,7 +420,7 @@ public void TogglePrivacy(int id, bool p) /// Helper method to Validate a membership /// /// The membership to validate - /// True if the membership is valid. Throws ResourceNotFoundException if not. Exception is cauth in an Exception Filter + /// True if the membership is valid. Throws ResourceNotFoundException if not. Exception is caught in an Exception Filter private bool validateMembership(MEMBERSHIP membership) { var personExists = _unitOfWork.AccountRepository.Where(x => x.gordon_id.Trim() == membership.ID_NUM.ToString()).Count() > 0; diff --git a/Gordon360/Services/NewsService.cs b/Gordon360/Services/NewsService.cs new file mode 100644 index 000000000..f5f58cdf0 --- /dev/null +++ b/Gordon360/Services/NewsService.cs @@ -0,0 +1,238 @@ +using Gordon360.Exceptions.CustomExceptions; +using Gordon360.Models; +using Gordon360.Models.ViewModels; +using Gordon360.Repositories; +using Gordon360.Services.ComplexQueries; +using System; +using System.Collections.Generic; +using System.Data.SqlClient; + +namespace Gordon360.Services +{ + public class NewsService : INewsService + { + private IUnitOfWork _unitOfWork; + + public NewsService(IUnitOfWork unitOfWork) + { + _unitOfWork = unitOfWork; + } + + /// + /// Gets a news item entity by id + /// NOTE: Also a helper method, hence why it returns a StudentNews model + /// rather than a StudentNewsViewModel - must be casted as the latter in its own + /// controller + /// + /// The SNID (id of news item) + /// The news item + public StudentNews Get(int newsID) + { + var newsItem = _unitOfWork.StudentNewsRepository.GetById(newsID); + // Thrown exceptions will be converted to HTTP Responses by the CustomExceptionFilter + if (newsItem == null) + { + throw new ResourceNotFoundException() { ExceptionMessage = "The news item was not found." }; + } + return newsItem; + } + + public IEnumerable GetNewsNotExpired() + { + return RawSqlQuery.query("NEWS_NOT_EXPIRED"); + } + + public IEnumerable GetNewsNew() + { + return RawSqlQuery.query("NEWS_NEW"); + } + + public IEnumerable GetNewsCategories() + { + return RawSqlQuery.query("NEWS_CATEGORIES"); + } + + /// + /// Gets unapproved unexpired news submitted by user. + /// + /// user id + /// username + /// Result of query + public IEnumerable GetNewsPersonalUnapproved(string id, string username) + { + // Verify account + var _unitOfWork = new UnitOfWork(); + var query = _unitOfWork.AccountRepository.FirstOrDefault(x => x.gordon_id == id); + if (query == null) + { + throw new ResourceNotFoundException() { ExceptionMessage = "The account was not found." }; + } + + // Query the database + var usernameParam = new SqlParameter("@Username", username); + return RawSqlQuery.query("NEWS_PERSONAL_UNAPPROVED @Username", usernameParam); + } + + + /// + /// Adds a news item record to storage. + /// + /// The news item to be added + /// username + /// id + /// The newly added Membership object + public StudentNews SubmitNews(StudentNews newsItem, string username, string id) + { + // Not currently used + ValidateNewsItem(newsItem); + + VerifyAccount(id); + + // SQL Parameters + var usernameParam = new SqlParameter("@Username", username); + var categoryIDParam = new SqlParameter("@CategoryID", newsItem.categoryID); + var subjectParam = new SqlParameter("@Subject", newsItem.Subject); + var bodyParam = new SqlParameter("@Body", newsItem.Body); + + // Run stored procedure + var result = RawSqlQuery.query("INSERT_NEWS_ITEM @Username, @CategoryID, @Subject, @Body", usernameParam, categoryIDParam, subjectParam, bodyParam); + if (result == null) + { + throw new ResourceNotFoundException() { ExceptionMessage = "The data was not found." }; + } + + return newsItem; + } + + /// + /// (Service) Deletes a news item from the database + /// + /// The id of the news item to delete + /// The deleted news item + /// The news item must be authored by the user and must not be expired + public StudentNews DeleteNews(int newsID) + { + // Service method 'Get' throws its own exceptions + var newsItem = Get(newsID); + + // Note: This check has been duplicated from StateYourBusiness because we do not SuperAdmins + // to be able to delete expired news, this should be fixed eventually by removing some of + // the SuperAdmin permissions that are not explicitly given + VerifyUnexpired(newsItem); + + var result = _unitOfWork.StudentNewsRepository.Delete(newsItem); + _unitOfWork.Save(); + return result; + } + + /// + /// (Service) Edits a news item in the database + /// + /// The id of the news item to edit + /// The news object that contains updated values + /// The updated news item's view model + /// The news item must be authored by the user and must not be expired and must be unapproved + public StudentNewsViewModel EditPosting(int newsID, StudentNews newData) + { + // Service method 'Get' throws its own exceptions + var newsItem = Get(newsID); + + // Note: These checks have been duplicated from StateYourBusiness because we do not SuperAdmins + // to be able to delete expired news, this should be fixed eventually by removing some of + // the SuperAdmin permissions that are not explicitly given + VerifyUnexpired(newsItem); + VerifyUnapproved(newsItem); + + // categoryID is required, not nullable in StudentNews model + if(newData.Subject == null || newData.Body == null) + { + throw new ResourceNotFoundException() { ExceptionMessage = "The new data to update the news item is missing some entries." }; + } + + newsItem.categoryID = newData.categoryID; + newsItem.Subject = newData.Subject; + newsItem.Body = newData.Body; + + _unitOfWork.Save(); + + return (StudentNewsViewModel)newsItem; + } + + /// + /// Helper method to verify that a given news item has not yet been approved + /// + /// The news item to verify + /// true if unapproved, otherwise throws some kind of meaningful exception + private bool VerifyUnapproved(StudentNews newsItem) + { + // Note: This check has been duplicated from StateYourBusiness because we do not SuperAdmins + // to be able to delete expired news, this should be fixed eventually by removing some of + // the SuperAdmin permissions that are not explicitly given + if (newsItem.Accepted == null) + { + throw new ResourceNotFoundException() { ExceptionMessage = "The news item acceptance status could not be verified." }; + } + if(newsItem.Accepted == true) + { + throw new BadInputException() { ExceptionMessage = "The news item has already been approved." }; + } + return true; + } + + /// + /// Helper method to verify that a given news item has not expired + /// (see documentation for expiration definition) + /// + /// The news item to verify + /// true if unexpired, otherwise throws some kind of meaningful exception + private bool VerifyUnexpired(StudentNews newsItem) + { + // DateTime of date entered is nullable, so we need to check that here before comparing + // If the entered date is null we shouldn't allow deletion to be safe + // Note: This check has been duplicated from StateYourBusiness because we do not SuperAdmins + // to be able to delete expired news, this should be fixed eventually by removing some of + // the SuperAdmin permissions that are not explicitly given + if (newsItem.Entered == null) + { + throw new ResourceNotFoundException() { ExceptionMessage = "The news item date could not be verified." }; + } + var todaysDate = DateTime.Now; + var newsDate = (DateTime)newsItem.Entered; + var dateDiff = (todaysDate - newsDate).Days; + if (dateDiff >= 14) + { + throw new Exceptions.CustomExceptions.UnauthorizedAccessException() { ExceptionMessage = "Unauthorized to delete expired news items." }; + } + return true; + } + + /// + /// Helper method to validate a news item + /// + /// The news item to validate + /// True if valid. Throws ResourceNotFoundException if not. Exception is caught in an Exception Filter + private bool ValidateNewsItem(StudentNews newsItem) + { + // any input sanitization should go here + + return true; + } + + /// + /// Verifies that a student account exists + /// + /// The id of the student + /// true if account exists, ResourceNotFoundException if null + private bool VerifyAccount(string id) + { + // Verify account + var _unitOfWork = new UnitOfWork(); + var query = _unitOfWork.AccountRepository.FirstOrDefault(x => x.gordon_id == id); + if (query == null) + { + throw new ResourceNotFoundException() { ExceptionMessage = "The account was not found." }; + } + return true; + } + } +} diff --git a/Gordon360/Services/SaveService.cs b/Gordon360/Services/SaveService.cs index f75e60654..5884ca750 100644 --- a/Gordon360/Services/SaveService.cs +++ b/Gordon360/Services/SaveService.cs @@ -27,9 +27,10 @@ public SaveService(IUnitOfWork unitOfWork) /// Fetch all upcoming ride items /// /// IEnumerable of ride items if found, null if not found - public IEnumerable GetUpcoming() + public IEnumerable GetUpcoming(string gordon_id) { - var result = RawSqlQuery.query("UPCOMING_RIDES"); //run stored procedure + var idParam = new SqlParameter("@STUDENT_ID", gordon_id); + var result = RawSqlQuery.query("UPCOMING_RIDES @STUDENT_ID", idParam); //run stored procedure if (result == null) { @@ -44,28 +45,10 @@ public IEnumerable GetUpcoming() /// /// The ride id /// ride items if found, null if not found - public IEnumerable GetUpcomingForUser(string gordon_id) + public IEnumerable GetUpcomingForUser(string gordon_id) { var idParam = new SqlParameter("@STUDENT_ID", gordon_id); - var result = RawSqlQuery.query("UPCOMING_RIDES_BY_STUDENT_ID @STUDENT_ID", idParam); //run stored procedure - - if (result == null) - { - return null; - } - - return result; - } - - /// - /// Fetch users in a ride specified by a ride_id - /// - /// The ride id - /// IEnumerable of user items if found, null if not found - public IEnumerable GetUsersInRide(string rideID) - { - var idParam = new SqlParameter("@RIDE_ID", rideID); - var result = RawSqlQuery.query("RIDERS_BY_RIDE_ID @RIDE_ID", idParam); //run stored procedure + var result = RawSqlQuery.query("UPCOMING_RIDES_BY_STUDENT_ID @STUDENT_ID", idParam); //run stored procedure if (result == null) { @@ -75,22 +58,6 @@ public IEnumerable GetUsersInRide(string rideID) return result; } - /// - /// Adds a new ride record to storage. - /// - /// The Save_Rides object to be added - /// The newly added custom event - public Save_Rides GetRide(string rideID) - { - - // Assign event id - var ride = _unitOfWork.RideRepository.FirstOrDefault(x => x.rideID == rideID); - if (ride == null) - { - throw new ResourceCreationException() { ExceptionMessage = "Ride event with this ID does not exist." }; - } - return ride; - } /// /// Adds a new ride record to storage. @@ -169,6 +136,24 @@ public Save_Rides DeleteRide(string rideID, string gordon_id) return result; } + /// + /// Cancel the ride whose id is specified by the parameter. + /// + /// The ride id + /// The gordon id + /// The ride that was just deleted + public int CancelRide(string rideID, string gordon_id) + { + var idParam = new SqlParameter("@STUDENT_ID", gordon_id); + var rideIdParam = new SqlParameter("@RIDE_ID", rideID); + var context = new CCTEntities1(); + + var result = context.Database.ExecuteSqlCommand("CANCEL_RIDE @STUDENT_ID, @RIDE_ID", idParam, rideIdParam); // run stored procedure. + _unitOfWork.Save(); + + return result; + } + /// /// Adds a new booking record to storage. /// @@ -229,19 +214,5 @@ public Save_Bookings DeleteBooking(string rideID, string gordon_id) return result; } - /// - /// Fetch number of valid drives (1 or more passengers) by ID - /// - /// The gordon id - /// IEnumerable of user items if found, null if not found - public int GetValidDrives(string gordon_id) - { - var idParam = new SqlParameter("@DRIVER_ID", gordon_id); - var context = new CCTEntities1(); - var result = context.Database.ExecuteSqlCommand("VALID_DRIVES_BY_ID @DRIVER_ID", idParam); //run stored procedure - - return result; - } - } -} \ No newline at end of file +} diff --git a/Gordon360/Services/ServiceInterfaces.cs b/Gordon360/Services/ServiceInterfaces.cs index 25b8b5467..38b897830 100644 --- a/Gordon360/Services/ServiceInterfaces.cs +++ b/Gordon360/Services/ServiceInterfaces.cs @@ -6,7 +6,7 @@ // // Namespace with all the Service Interfaces that are to be implemented. I don't think making this interface is required, the services can work find on their own. -// However, building the interfaces first does give a general sense of structure to their implementations. A certian cohesiveness :p. +// However, building the interfaces first does give a general sense of structure to their implementations. A certain cohesiveness :p. // namespace Gordon360.Services { @@ -50,6 +50,13 @@ public interface IAccountService AccountViewModel GetAccountByUsername(string username); } + public interface IWellnessService + { + IEnumerable GetStatus(string id); + IEnumerable GetQuestion(); + WellnessViewModel PostStatus(bool answer, string id); + } + public interface IActivityService { ActivityInfoViewModel Get(string id); @@ -127,7 +134,7 @@ public interface IJenzibarActivityService IEnumerable GetAll(); } - + public interface IMembershipService { IEnumerable GetLeaderMembershipsForActivity(string id); @@ -138,6 +145,7 @@ public interface IMembershipService int GetActivityFollowersCountForSession(string id, string sess_cde); int GetActivityMembersCountForSession(string id, string sess_cde); IEnumerable GetAll(); + MEMBERSHIP GetSpecificMembership(int id); int GetActivityFollowersCount(string id); int GetActivityMembersCount(string id); MEMBERSHIP Add(MEMBERSHIP membership); @@ -158,6 +166,18 @@ public interface IJobsService IEnumerable getActiveJobs(DateTime shiftStart, DateTime shiftEnd, int studentID); IEnumerable editShiftOverlapCheck(int studentID, DateTime shiftStart, DateTime shiftEnd, int rowID); IEnumerable checkForOverlappingShift(int studentID, DateTime shiftStart, DateTime shiftEnd); + IEnumerable saveShiftForStaff(int staffID, int jobID, DateTime shiftStart, DateTime shiftEnd, string hoursWorked, string shiftNotes, string lastChangedBy); + IEnumerable getSavedShiftsForStaff(int ID_NUM); + IEnumerable editShiftStaff(int rowID, DateTime shiftStart, DateTime shiftEnd, string hoursWorked, string username); + IEnumerable deleteShiftForStaff(int rowID, int staffID); + IEnumerable submitShiftForStaff(int staffID, int jobID, DateTime shiftEnd, int submittedTo, string lastChangedBy); + IEnumerable getActiveJobsStaff(DateTime shiftStart, DateTime shiftEnd, int staffID); + IEnumerable getStaffSupervisorNameForJob(int supervisorID); + IEnumerable editShiftOverlapCheckStaff(int staffID, DateTime shiftStart, DateTime shiftEnd, int rowID); + IEnumerable checkForOverlappingShiftStaff(int staffID, DateTime shiftStart, DateTime shiftEnd); + IEnumerable ClockOut(string id); + ClockInViewModel ClockIn(bool state, string id); + ClockInViewModel DeleteClockIn(string id); } public interface IParticipationService @@ -193,7 +213,7 @@ public interface IScheduleControlService } - public interface IMyScheduleService + public interface IMyScheduleService { MYSCHEDULE GetForID(string event_id, string gordon_id); IEnumerable GetAllForID(string gordon_id); @@ -204,13 +224,11 @@ public interface IMyScheduleService public interface ISaveService { - IEnumerable GetUpcoming(); // done - IEnumerable GetUpcomingForUser(string gordon_id); //done - //IEnumerable GetUsersInRide(string ride_id); // make SaveUserViewModel - Save_Rides GetRide(string ride_id); + IEnumerable GetUpcoming(string gordon_id); // done + IEnumerable GetUpcomingForUser(string gordon_id); //done Save_Rides AddRide(Save_Rides newRide, string gordon_id); //done Save_Rides DeleteRide(string rideID, string gordon_id); //done - int GetValidDrives(string ride_id); + int CancelRide(string rideID, string gordon_id); Save_Bookings AddBooking(Save_Bookings newBooking); //done Save_Bookings DeleteBooking(string rideID, string gordon_id); //done @@ -221,5 +239,16 @@ public interface IContentManagementService IEnumerable GetSliderContent(); } -} + public interface INewsService + { + StudentNews Get(int newsID); + IEnumerable GetNewsNotExpired(); + IEnumerable GetNewsNew(); + IEnumerable GetNewsCategories(); + IEnumerable GetNewsPersonalUnapproved(string id, string username); + StudentNews SubmitNews(StudentNews newsItem, string username, string id); + StudentNews DeleteNews(int newsID); + StudentNewsViewModel EditPosting(int newsID, StudentNews newsItem); + } +} diff --git a/Gordon360/Services/WellnessService.cs b/Gordon360/Services/WellnessService.cs new file mode 100644 index 000000000..2fe443fa7 --- /dev/null +++ b/Gordon360/Services/WellnessService.cs @@ -0,0 +1,161 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Web; +using Gordon360.Models; +using Gordon360.Models.ViewModels; +using Gordon360.Repositories; +using Gordon360.Exceptions.CustomExceptions; +using System.Data.SqlClient; +using Gordon360.Services.ComplexQueries; +using System.Diagnostics; + +namespace Gordon360.Services +{ + public class WellnessService : IWellnessService + { + + + public WellnessService() + { + } + + /// + /// gets status of wellness check + /// + /// id + /// boolean if found, null if not found + + public IEnumerable GetStatus(string id) + { + var _unitOfWork = new UnitOfWork(); + var query = _unitOfWork.AccountRepository.FirstOrDefault(x => x.gordon_id == id); + if (query == null) + { + throw new ResourceNotFoundException() { ExceptionMessage = "The account was not found." }; + } + + var idParam = new SqlParameter("@ID_NUM", id); + var result = RawSqlQuery.query("GET_HEALTH_CHECK_BY_ID @ID_NUM", idParam); //run stored procedure + + if (result == null) + { + throw new ResourceNotFoundException() { ExceptionMessage = "The data was not found." }; + } + + + var wellnessModel = result.Select(x => + { + WellnessViewModel y = new WellnessViewModel(); + + DateTime currentTime = DateTime.Now; + + DateTime changeTime = new DateTime(currentTime.Year, currentTime.Month, currentTime.Day, 5, 0, 0); + + // Answer is good until 5am the next day, so changeTime is most recent 5am + // which might be yesterday. + if(changeTime > currentTime) + { + TimeSpan day = new TimeSpan(24, 0, 0); + changeTime = new DateTime(changeTime.Ticks - day.Ticks); + } + + if (x.timestamp >= changeTime) + { + y.answerValid = true; + y.userAnswer = x.userAnswer; + y.timestamp = x.timestamp; + return y; + } + + y.answerValid = false; + y.userAnswer = x.userAnswer; + y.timestamp = x.timestamp; + + return y; + }); + + + return wellnessModel; + + } + + /// + /// Gets answer to the wellness check answer and sends it to the back end. + /// If answer boolean is true: student is feeling symptomatic + /// If answer boolean is false: student is not feeling symptomatic + /// + /// id + /// answer + /// Ok if message was recorded + + public WellnessViewModel PostStatus(bool answer, string id) + { + var _unitOfWork = new UnitOfWork(); + var query = _unitOfWork.AccountRepository.FirstOrDefault(x => x.gordon_id == id); + if (query == null) + { + throw new ResourceNotFoundException() { ExceptionMessage = "The account was not found." }; + } + + var idParam = new SqlParameter("@ID_NUM", id); + var answerParam = new SqlParameter("@Answer", answer); + + var result = RawSqlQuery.query("INSERT_HEALTH_CHECK @ID_NUM, @Answer", idParam, answerParam); //run stored procedure + if (result == null) + { + throw new ResourceNotFoundException() { ExceptionMessage = "The data was not found." }; + } + + var UserAnswer = answer; + + WellnessViewModel y = new WellnessViewModel() + { + userAnswer = UserAnswer + }; + + + + return y; + + } + + /// + /// gets the question for the wellness check from the back end + /// + /// list of strings with questions and prompts + + public IEnumerable GetQuestion() + { + + var result = RawSqlQuery.query("GET_HEALTH_CHECK_QUESTION"); //run stored procedure + + + if (result == null) + { + throw new ResourceNotFoundException() { ExceptionMessage = "The data was not found." }; + } + + + var wellnessQuestionModel = result.Select(x => + { + WellnessQuestionViewModel y = new WellnessQuestionViewModel(); + + y.question = x.question; + + y.yesPrompt = x.yesPrompt; + + y.noPrompt = x.noPrompt; + + return y; + }); + + + + return wellnessQuestionModel; + + } + + } + +} diff --git a/Gordon360/Static Classes/Names.cs b/Gordon360/Static Classes/Names.cs index e3665d878..876e9d699 100644 --- a/Gordon360/Static Classes/Names.cs +++ b/Gordon360/Static Classes/Names.cs @@ -12,7 +12,7 @@ public static class Resource public const string ACCOUNT = "An Account Resource."; public const string ADVISOR = "An Advisor Resource"; public const string GROUP_ADMIN = "A Group Admin Resource"; - public const string ADMIN = "An admininistrator Ressource"; + public const string ADMIN = "An admininistrator Resource"; public const string ACTIVITY_INFO = "An Activity Info Service."; public const string ACTIVITY_STATUS = "The open or closed status of an activity"; public const string ChapelEvent = "The info of chapel events"; @@ -21,6 +21,7 @@ public static class Resource public const string MYSCHEDULE = "A custom schedule resource"; public const string Save_Rides = "A ride resource"; public const string SCHEDULE = "A course schedule resource"; + public const string NEWS = "A student news resource"; public const string SHIFT = "A shift that a student has worked"; // Partial resources, to be targetted by Operation.READ_PARTIAL diff --git a/Gordon360/Web.Release.config b/Gordon360/Web.Release.config index eb4687c12..d3a5fcf19 100644 --- a/Gordon360/Web.Release.config +++ b/Gordon360/Web.Release.config @@ -1,4 +1,4 @@ - + @@ -14,14 +14,17 @@ - + + - + -
+
- - - - - + + + + + - - + + - - - - + + + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - + - + - - \ No newline at end of file + + diff --git a/Gordon360/browseable/profile/Default/ID.png b/Gordon360/browseable/profile/Default/ID.png new file mode 100644 index 000000000..ce25268f3 Binary files /dev/null and b/Gordon360/browseable/profile/Default/ID.png differ diff --git a/README.md b/README.md index 7c0ad9e0b..920a58202 100644 --- a/README.md +++ b/README.md @@ -6,7 +6,7 @@ Dive in. ## Table of Contents - [Machines and Sites](#machines-and-sites) - [Deploying to the Api Site](#deploying-to-the-api-site) - - [Deploying to the Front-end site](#deploying-to-the-front-end-site) + - [Deploying to the Front-end site (deprecated)](#deploying-to-the-front-end-site) - [Running the API locally](#running-the-api-locally) - [Preliminary setup](#preliminary-setup) - [Building and running](#building-and-running) @@ -15,7 +15,7 @@ Dive in. - [Stored Procedures](#stored-procedures) - [Triggers](#triggers) - [Manual and Debugging Access](#manual-and-debugging-access) - - [Updating .edmx](#updating-edmx) + - [Updating or creating .edmx](#updating-or-creating-edmx) - [The Code](#the-code) - [Introduction](#introduction) - [Adding New Queries](#adding-new-queries) @@ -34,15 +34,18 @@ Dive in. - [Participation Definitions](#participation-definitions) - [Profiles](#profiles) - [Sessions](#sessions) - - [Dining](#dining) + - [Dining](#dining) - [Student Employment](#student-employment) - [Schedule](#schedule) - [MySchedule](#my-schedule) - [ScheduleControl](#schedule-control) - [Victory Promise](#victory-promise) + - [News](#news) + - [Wellness Check](#wellness-check) - [API Testing](#api-testing) - [Introduction](#introduction) - [Running the Tests](#running-the-tests) + - [Writing the Tests](#writing-the-tests) - [Troubleshooting](#troubleshooting) - [Documentation](#documentation) @@ -120,9 +123,9 @@ Data which is stored upon startup includes: * It is easiest to use the development virtual machine to work on this project. Follow [these instructions](RemoteDesktopToVM.md) to set up and connect to the virtual machine using your Gordon account. -* If this is your first time on the virtual machine, you will need to clone this repository. You can do this by using Git Bash. +* If this is your first time on the virtual machine, you will need to clone this repository. You can do this by using Git Bash. It is possible that you will need to [add the SSH key to your Git account](https://help.github.com/en/github/authenticating-to-github/connecting-to-github-with-ssh), it will guide you to `cd .ssh` then `cat id_rsa.pub`, copy the output and go to your github settings and paste it in your SSH keys. - * Before you open the gordon-360-api folder, you will have to add the `secrets.config` file to it. The file is located on the CS-RDSH-02 virtual machine in `C:\Users\Public\Public Documents\` (or `/c/users/public/documents\` when in git-bash). Copy the file `secrets.config` to the same folder in your project that contains the `web.config` file; currently, this is in `gordon-360-api\Gordon360`. This file is a sort of keyring for the server to authorize itself at various points. + * Before you open the gordon-360-api folder, you will have to add the `secrets.config` file to it. The file is located on the CS-RDSH-02 virtual machine in `C:\Users\Public\Public Documents\` (or `/c/users/public/documents\` when in git-bash). Copy the file `secrets.config` to the same folder in your project that contains the `web.config` file; currently, this is in `gordon-360-api\Gordon360`. This file is a sort of keyring for the server to authorize itself at various points. You can do this by CDing into the Gordon360 folder and typing `cp /C/users/public/documents/secrets.config .` * Look for the desktop app Visual Studio 2017, which has a purple Visual Studio icon. You might have to search for it through the start menu. You will have to log in to a Microsoft account. Your Gordon email will work for this. Once you log in, go to `File > Open > Project/Solution`. In the navigation box that pops up, navigate to the directory where you cloned this repo, and select and open the file `/Gordon360.sln`. @@ -132,15 +135,17 @@ Data which is stored upon startup includes: * Now, you can press the Start button in Visual Studio to run the server (it is a green play button in the top middle of the tool bar). It will open the web browser and, after a period that should just be a few minutes long but sometimes lasts half an hour or more, display an Error 403.14 - Forbidden. This is expected. You can now begin manually testing the API. +* If you haven't already, you'll need to `npm install` in the gordon-360-ui repo. This only needs to be done once, then you can just `npm start`. + * If you want to test the UI, keep the server running and follow the directions found [here](/~https://github.com/gordon-cs/gordon-360-ui/blob/develop/README.md#connect-local-backend-to-react) under "Connect Local Backend to React". ## The Database -The `CCT` database exists in: +The `CCT` and `MyGordon` databases exist in: - `admintrainsql.gordon.edu` - The development/test database server - `adminprodsql.gordon.edu` - The production/live database server. -### Tables +### CCT Tables All the tables were created from scratch by our team. @@ -258,8 +263,36 @@ A record in this table stores This table is an exact duplicate of the JENZ_ACT_CLUB_DEF view. It is periodically updated by making sure what is in it corresponds to what is in JENZ_ACT_CLUB_DEF. When a new activity is found in JENZ_ACT_CLUB_DEF, it is inserted into ACT_CLUB_DEF and the stored procedure UPDATE_ACT_INFO is run. +### MyGordon Tables + +These are just the MyGordon tables used by 360. They were originally not made for this site. -### Views +##### StudentNews + +A record in this table stores + +- SNID - unique integer identifier for a news entry +- ADUN - username (first.last) of the person who posted the entry +- categoryID - foreign key that links this entry to its category +- Subject - subject, written by the poster, of the news entry +- Body - the actual text of the news entry, written by the poster +- Accepted - whether this entry has been approved to be shown publicly +- Sent - whether the item has been sent +- thisPastMailing - whether it belongs to this past mailing +- Entered - when, in datetime format, the post was submitted by the poster +- fname - not used (NULL) +- lname - not used (NULL) +- ManualExpirationDate - given by the poster, the last day on which this entry should be displayed publicly + +##### StudentNewsCategory + +A record in this table stores + +- categoryID - a unique integer identifier +- categoryName - the name of a category, ex. "Found Items" +- SortOrder - an integer representing the category's placement in the preferred display order + +### CCT Views We got access to these views through CTS. They are a direct live feed from the tables they represent. As mentioned earlier, we cannot use primary keys in the views to make foreign keys in other tables. @@ -292,7 +325,7 @@ A subset of `ACCOUNT` that has only student records. ###### 360_SLIDER Content (images, captions, and links) for the slider on the dashboard page. -### Stored Procedures +### CCT Stored Procedures Stored procedures have been written to make some database accesses and administrative tasks easier. Here are the most important ones. @@ -319,7 +352,7 @@ In non-sql terms, this procedure makes sure all the activities defined in ACT_CL This stored procedures is pretty simple. It moves all the relevant information from the MEMBERSHIP table and puts it in the JNZB_ACTIVITIES table. To prevent duplication, it will only add records that are present in the MEMBERSHIP table, but missing the JNZB_ACTIVITIES table. -### Triggers +### CCT Triggers ###### ACT_CLUB_DEF_INSERT_TRIGGER @@ -333,25 +366,50 @@ It's sometimes useful to look at the database directly, to see the schema or che * Shift-right-click SSMS (SQL Server Management Studio) and select "Run as ..." * Run as "cct.service" * Connect to "ADMINTRAINSQL" database server (or "ADMINPRODSQL") -* Expand "Databases" then "CCT" then "Views" +* Expand "Databases" then "CCT" or "MyGordon" (the two currently used databases) then "Views" * To see schemas, expand "dbo." entries and their "columns" * To see data, right-click a view and select "Select top 1000 rows" -### Updating edmx - -Everytime you update the database with new table, column, view or stored procedure, or modify the existing ones with different parameters or return values, you need to get the corresponding Entity Database Model XML in API. Editing it manually is not recommended, since it may cause unexpected errors such as PublicStudentData error. - -Visual Studio provides auto-generation of .edmx file, with the following procedure: -* Use remote desktop to get to the Windows server VM -* Open Visual Studio and load the solution file -* In solution explorer, expand "Models" folder and delete the previous CCT_DB_MODELS.edmx by right-click on it and press delete (It's okay, we can remake it) -* Right-click "Models", expand "Add" and press "new Item" (If you can see ADO.NET Entity Data Model in here, you may press that as well) -* Under Visual C# panel, access to "Data" and find ADO.NET Entity Data Model. Name it as "CCT_DB_Models" and create it -* In the Wizard, default option would be "EF Designer from database". If it is not, changed to this option and head next -* While you choose your data connection, make sure the connection is "CCTEntities (Gordon360)" and you checked "Save connection setting in Web.Config as:". Also, the saved settings should be named as "CCTEntities1" -* Next, you will see the wizard retrieving the database objects from our CCT database. check all boxes in the panel but you should uncheck the option "Pluralize or singularize generated object names" -* Name the Model Namespace as "Gordon360" and press finish - +### Updating or Creating edmx + +Everytime you update the one of the databases with a new table, column, view or stored procedure, or modify the existing ones with different parameters or return values, you need to get the corresponding Entity Database Model XML in the API. Editing it manually is not recommended, since it may cause unexpected errors such as PublicStudentData error. + +
+Permissions Note: +
If data tables appears to be missing from edmx generation or if some kind of "SELECT permission denied" error occurs during testing, you may need to be running Visual Studio as the cct.service user (or obtain the appropriate permissions for yourself) before generating these files. (Summer 2020 note)
+ +#### UPDATE EDMX FILES +Visual Studio provides auto-generation of .edmx files, with the following procedure: +* *Setup* + * Use remote desktop to get to the Windows server VM + * Open Visual Studio and load the solution file + +* *Deleting the old edmx files* + * In the solution explorer, expand the "Models" folder and delete the previous `_DB_MODELS.edmx` which represents the database to which you made changes; for example, if it was the CCT database that was changed, delete CCT_DB_MODELS.edmx by right clicking and selecting 'delete' (it's okay, we can remake it) + * At the bottom of the `web.config` file there is a `` tag with an `` tag for every connection string nested within. Delete the connection string (the `` tag) for the DB connection you are regenerating (if this is confusing, [this step](#connection-string) explains why you may need it deleted) + +* *Generating the new edmx files* + * Right-click "Models", expand "Add" and press "New Item" (If you can see ADO.NET Entity Data Model in here, you may press that as well) + * Under Visual C# panel, access "Data" and find ADO.NET Entity Data Model. Name it `_DB_Models` and create it + * In the Wizard, the default option should be "EF Designer from database". If it is not, change to this option and head next + * Choose the data connection "`Entities` (Gordon360)" (though, if it is CCT, there should be a "1" after "Entities"). If the appropriate connection does not exist, see below to create one + * + Make sure you check "Save connection setting in Web.Config as:" and name the saved settings `Entities` (again, if it is CCT, it should be "CCTEntities1" with that additional "1"). If there is an error that the name already exists, it is because the connection string needs to be removed from `web.config` (see above) + * Next, you will see the wizard retrieving the database objects from our CCT database; check all boxes in the panel but you should uncheck the option "Pluralize or singularize generated object names" + * Name the Model Namespace as `Gordon360` and press finish + +#### CREATE NEW EDMX FILES +If you are attempting to connect the API to a database other than the ones to which it is already connected, you will need to create an entirely new edmx. To do this, follow the instructions above for updating, taking note of the following points: +* You do not need to delete any edmx files, since you are now creating the first instance of a different edmx +* +None of the options for data connection will fit your needs, so you will need to create a new option: + * Click "New Connection..." + * If prompted "Choose Data Source", choose "Microsoft SQL Server" + * For "Server name", put `admintrainsql.gordon.edu` + * Under "Connect to a Database", make sure "Select or enter a database name:" is selected and enter `` + * Go to Advanced settings, scroll to the top, and make sure "MultipleActiveResultSets" is set to True; then, scroll towards the bottom to find "Integrated Security" and make sure that is set to True + * Click OK to close Advanced settings, then OK again to save the data connection you have just made +* Now, you can select the data connection you just made from the drop down and pick up with the above directions at 'Make sure you check "Save connection...' ## The Code @@ -519,6 +577,8 @@ In OAuth, there are two servers including the one running your app. The server r In our project, the Authentication Server and the App Server are actually the same. They are only separated code-wise. You could say that the *App* is the ApiControllers folder and the *Authentication Server* is the AuthorizationServer folder (Recall that it is currently named incorrectly, sorry. We haven't changed the name because it would require changing multiple import statements, and we don't have time to debug after the change). +*__Note: See the section on Manually Testing the API for most up-to-date instructions on authenticating your test HTTP requests.__* + Accepts a form encoded object in the body of the request: ``` { @@ -808,16 +868,69 @@ What is it? Resource that represents information related to schedule. ### Victory Promise What is it? Resource that represents the user's scores on the four pillars of the victory promise. -#### GET +##### GET `api/vpscore` Get the victory promise scores of the currently logged in user. +### News +What is it? Resource that represents accepted student news entries and news categories. + +##### GET + +`api/news/category` Gets the full list of category names used to categorize student news as well as category ids and sort order. + +`api/news/not-expired` Gets every student news entry that has been accepted and has not yet been in the database 2 weeks or, if the poster set a specific date of expiration, has an expiration date later than the current day. + +`api/news/new` Gets every student news entry that has been accepted, has not expired (as described above), and is new since 10am on the day before. + +`api/news/personal-unapproved` Gets all of the unexpired and unapproved news submissions by the authenticated user +_(uses stored procedure)_ + +##### POST + +`api/news` Submits a news item into the database (initally unapproved) +_(uses stored procedure)_ + +##### DELETE + +`api/news/:id` Deletes a news item from the database by its id (SNID = student news id). In order to delete, the following conditions must be met: + +- news item is unexpired +- user is author of news item or SUPER_ADMIN (perhaps should be changed in future) + +_(uses repository)_ + +##### PUT + +`api/news/:id` Edits a news item in the database by its id. In order to edit, the following conditions must be met: + +- news item is unexpired +- user is author of news item or SUPER_ADMIN (perhaps should be changed in future) +- news item has not yet been approved + +_(uses repository)_ + +### Wellness Check +Back endpoint responsible for fetching and sending information to the database regarding the answers to the wellness check. + +##### GET + +`api/wellness` Gets the latest answer a student has sent, as well as a boolean that specifies whether the answer is still valid based on when the answer was submitted. + +`api/wellness/Question` Gets the wellness check question to be displayed on the front end from the Data base. + + +##### POST + +`api/wellness` Sends an answer boolean to the database that specifies whether a student is symptomatic or not: true = symptomatic, false = not symptomatic. + + ## API Testing ### Introduction A test suite is available at `Tests/ApiEndpoints` to exercise the different endpoints. The most important files here are: -- `test_gordon360_pytest` -- Stores all the tests. +- `test_gordon360_pytest` -- Stores all the necessary variables and authentication. - `activity_code` -- The activity that will be used for testing. - `random_id_number` -- A random id number that is used when we want to verify if we can do things on behalf of someone else. E.g. An advisor can create memberships for anyone. A regular member can only create a membership for him/herself. - `leadership_positions` -- A list of participation levels considered to be leadership positions. @@ -826,25 +939,56 @@ A test suite is available at `Tests/ApiEndpoints` to exercise the different endp - `password` -- String with the password of a test account that is a member of `activity_code` - `id_number` -- Integer with the id number of the `username`. - `username_activity_leader` -- String with the username of a test account that is a leader of `activity_code` +- `test_allaccount_pytest` -- Tests for api/accounts/ endpoint +- `test_allactivities_pytest` -- Tests for api/activities/ endpoint +- `test_alladmin_pytest` -- Tests for api/admins/ endpoint +- `test_allauthentication_pytest` -- Tests for token/ endpoint +- `test_alldining_pytest` -- Tests for api/dining/ endpoint +- `test_allemail_pytest` -- Tests for api/emails/activity/ endpoint +- `test_allevents_pytest` -- Tests for api/events/ endpoint +- `test_allmembership_pytest` -- Tests for api/memberships/ endpoint +- `test_allmembershiprequest_pytest` -- Tests for api/requests/ endpoint +- `test_allmyschedule_pytest` -- Tests for api/myschedule/ endpoint +- `test_allnews_pytest` -- Tests for api/news/ endpoint +- `test_allprofile_pytest` -- Tests for api/profiles/ endpoint +- `test_allschedule_pytest` -- Tests for api/schedule/:username/ endpoint +- `test_allschedulecontrol_pytest` -- Tests for api/schedulecontrol/ endpoint +- `test_allsession_pytest` -- Tests for api/sessions/ endpoint +- `test_allstudentemployment_pytest` -- Tests for api/studentemployment/ endpoint +- `test_allvictorypromise_pytest` -- Tests for api/vpscore/ endpoint +- `test_allwellnesscheck_pytest` -- Tests for api/wellness/ endpoint ### Running the Tests Clone the project from the github site: `git clone /~https://github.com/gordon-cs/gordon-360-api.git` -Copy credentials.py into gordon-360-api/Tests/ApiEndpoints/. The file is located on the CS-RDSH-02 virtual machine in `C:\Users\Public\Public Documents\` (or `/c/users/public/documents\` when in git-bash). It is the same location where secrets.config is located. +Copy credentials.py into gordon-360-api/Tests/ApiEndpoints/. The file is located on the CS-RDSH-02 virtual machine in `C:\Users\Public\Public Documents\` (or `/c/users/public/documents\` when in git-bash). It is the same location where secrets.config is located. Navigate to the API Tests folder: `cd gordon-360-api/Tests/ApiEndpoints/` Install pytest: `pip install -U pytest` -Check the `hostURL` in test_gordon360_pytest.py if it is pointing to the correct backend +*Note: If you encounter an error of a missing requests import, you may need to install it with `pip install requests` (Summer 2020 fix)* + +Check the `hostURL` in test_gordon360_pytest.py if it is pointing to the correct backend Run the tests: `pytest` -- This runs all the tests. -`pytest test_gordon360_pytest.py -k '{name of def}'` -- This runs a specific test based on {name of def}. +`pytest '{name of test file}'` -- This runs a specific test file based on {name of test file}. +`pytest '{name of test file}' -k '{name of def}'` -- This runs a specific test in a specific file based on {name of test file} and {name of def}. +### Writing the Tests + +To ensure fewer assertion errors due to future value changes, asserts should avoid values that change frequently over time unless other tests change the values accordingly or the test is set on a specific time. + +Suggestions to make tests more robust: +- Check to see that the response is a list +- Assert that one of the dictionaries in the list has a certain key +- Check that the list isn't empty before checking for its content + + #### Manually Testing the API To manually test the API, use an API development/testing app like [Postman](https://www.getpostman.com/). @@ -878,6 +1022,12 @@ To manually test the API, use an API development/testing app like [Postman](http ## Troubleshooting +#### Assertion Errors + +Some values are dependant on other tests being run after the failed test. To fix this, run the all test files using `pytest` on the command line twice. + +Some values are updated frequently over time, to ensure compatibility of tests in the future, value assertions are discouraged. To fix issues from value changes, manually updating or removing the assertions are necessary. + #### 500 Server Error when updating Activity Images This is usually a folder permissions problem. The Json site runs as the user cct.service@gordon.edu. To solve this issue, edit the permissions to allow the cct.service@gordon.edu user to edit the `browseable` folder. The folder is located in the Api site folder (either 360Api or 360ApiTrain, depending on which is having the problem). diff --git a/RemoteDesktopToVM.md b/RemoteDesktopToVM.md index 51c3254fd..a22658af1 100644 --- a/RemoteDesktopToVM.md +++ b/RemoteDesktopToVM.md @@ -22,32 +22,67 @@ The Remmina control window will open on your desktop and you'll see a new icon f * User name: _use firstname.lastname form without @gordon.edu_ * Password: _enter your Gordon password, or leave it blank, which would require you to enter this every time you connect_ * Domain: `GORDON` - * Resolution: `Use Client Resolution` + * Resolution: `Use Client Resolution` * Color Depth: change to `True color (24 bpp)` 2. Click on the "Advanced" tab and change the value of Quality to "Best (slowest)" 3. Click "Save" at the bottom of the window. 4. Double click on `CS-RDSH-02` to initiate a connection to the virtual machine. -5. If, upon start up, it asks you "Accept Certificate?", just refuse. +5. If, upon start up, it asks you "Accept Certificate?", just refuse. 6. You can close the Server Manager window that automatically opens each time you start the virtual machine. If you were connecting in order to run the server locally, click [here](/~https://github.com/gordon-cs/gordon-360-api/blob/develop/README.md#running-the-server-locally) to return to those instructions. -## Connect from Windows -~~1. Use a web browser to connect to [desktops.gordon.edu](https://desktops.gordon.edu) and log in with your Gordon email address and password. -2. Click on "VDI-ComputerScience" to download the Remote Desktop configuration file. -3. Open the downloaded file and follow the prompts to make the connection.~~ +## Connect from Windows -The above instructions are not working as of 03/02/2020. Follow these instructions instead: +Ensure that you are connected to the Gordon network (either locally or through a VPN) -1. Open Remote Desktop Connection. - - Search "RDC" in the start menu and it will appear there. -2. In the address bar, type `cs-rdsh-02`. +*Option 1: If you have RDC installed by default (might work better remotely)* +1. Open Remote Desktop Connection + - Search "RDC" in the start menu and it will appear there + - Note: Might be the Remote Desktop app, and not the Remote Desktop Connection app. +2. In the address bar (under "Computer" or "PC Name"), type in `CS-RDSH-02` (not case-sensitive). 3. To enter your Gordon credentials: - - If this is your first time connecting, click "Connect." Your computer might try to use your local account by default. In that case you'll need to select "More choices" at the bottom of the dialog box and then enter your Gordon account details as `gordon.edu\firstname.lastname` and your account password. - - If you have connected to the machine before, ensure that the listed account is the one you want to use. If it isn't, click "edit" and then follow the step above. -4. Click "Connect." + - If this is your first time connecting: + - Click "Connect." Your computer might try to use your local account by default. In that case you'll need to select "More choices" at the bottom of the dialog box and then enter your Gordon account details as `gordon.edu\firstname.lastname` and your account password. + - If you have connected to the machine before: + - Ensure that the listed account is the one you want to use. If it isn't, click "edit" and then follow the step above +4. Click "Connect" + +*Option 2: If you have Remote Desktop installed by default (might work better on campus)* +1. Open Remote Desktop + - Go to search bar, on the left side of the taskbar on your machine and type in 'Remote Desktop'. + - Click on the Remote Desktop app. Not the Remote Desktop Connection app. +2. Add the PC + - In the Remote Desktop window, click on 'Add' at the top right of the window. + - Click on 'Desktop'. + - Under 'PC name', type in `CS-RDSH-02` (not case-sensitive). +3. Optional: Enter credentials + - Under 'User account', you may enter your Gordon username ('@gordon.edu' is not needed). + - Under 'Password', enter your Gordon password. + - 'Display name' is optional. +4. Run and connect + - Click on the saved desktop you just created. + - A pop-up will be shown asking 'Accept Certificate?'. You may check the one available option to never see the pop-up again and click on 'accept'. ## Connect from MacOS -(to be written) +1. Open Microsoft Remote Desktop + - Click in the upper-right corner of the menu bar, or press Command-Space bar for spotlight search and type in 'remote'. + - Launch the 'Microsoft Remote Desktop' app. If it's not already installed, it can be installed [here](https://apps.apple.com/us/app/microsoft-remote-desktop/id1295203466?mt=12). +2. Add the PC + - In the Microsoft Remote Desktop window, click on 'Preferences'. + - Press the '+' sign in the bottom left. + - Name the Gateway name whatever you’d like. + - For 'Server', type in `CS-RDSH-02.gordon.edu` (not case-sensitive). + - Enter your Gordon credentials for 'User name' and 'Password'. + - Close the Preferences window. +3. Run and connect + - In the Microsoft Remote Desktop window, click on 'New'. + - Name the 'Connection name' whatever you’d like (I recommend the same as the 'Gateway name') + - Under 'PC name', type in `CS-RDSH-02` (not case-sensitive). + - Select the Gateway you created from the dropdown. + - Enter your Gordon credentials for 'User name' and 'Password'. + - Close the 'Edit Remote Desktops' window + - Select the remote connection you just created under 'My Desktops' and press 'Start' (or double click). + - A pop-up will be shown asking 'Accept Certificate?'. You may check the one available option to never see the pop-up again and click on 'accept'. diff --git a/Tests/ApiEndpoints/pytest_components.py b/Tests/ApiEndpoints/pytest_components.py index de7abb50b..d19d742b5 100644 --- a/Tests/ApiEndpoints/pytest_components.py +++ b/Tests/ApiEndpoints/pytest_components.py @@ -15,7 +15,7 @@ def postAsJson(session, url, resource): return response def postAsFormData(session, url, resource): - response = session.post(url,json=resource) + response = session.post(url, files=resource) return response def put(session, url, resource): diff --git a/Tests/ApiEndpoints/test_admin_pytest.py b/Tests/ApiEndpoints/test_admin_pytest.py new file mode 100644 index 000000000..9ca1de08d --- /dev/null +++ b/Tests/ApiEndpoints/test_admin_pytest.py @@ -0,0 +1,142 @@ +import pytest +import warnings +import string +from pytest_components import requests +from datetime import datetime + +import pytest_components as api +import test_gordon360_pytest as control + +class Test_AdminTest(control.testCase): + +# # # # # # # # +# ADMIN TEST # +# # # # # # # # + +# Verify that a super admin get information of a specific admin via GordonId. +# Endpoint -- api/admins +# Expected Status Code -- 200 OK +# Expected Response Body -- A json response with the student resource + def test_get_all_admin_as_leader(self): + self.session = \ + self.createAuthorizedSession(control.leader_username, control.leader_password) + self.url = control.hostURL + 'api/admins/' + response = api.get(self.session, self.url) + if not response.status_code == 200: + pytest.fail('Expected 200 OK, got {0}.'\ + .format(response.status_code)) + try: + response.json() + except ValueError: + pytest.fail('Expected Json response body, got {0}.'\ + .format(response.text)) + if not (type(response.json()) is list): + pytest.fail('Expected list, got {0}.'.format(response.json)) + print(response.json()) + assert response.json()[1]['EMAIL'] == "360.FacultyTest@gordon.edu" + assert response.json()[0]['EMAIL'] == "Chris.Carlson@gordon.edu" + assert response.json()[0]['ADMIN_ID'] == 1 + assert response.json()[0]['ID_NUM'] == 8330171 + assert response.json()[0]['USER_NAME'] == "Chris.Carlson" + assert response.json()[0]['EMAIL'] == "Chris.Carlson@gordon.edu" + +# Verify that a guest can't get information of a specific admin via GordonId. +# Endpoint -- api/admins +# Expected Status Code -- 401 Unauthorized Error +# Expected Response Body -- An authorization denied error + def test_get_all_admin_as_guest(self): + self.session = self.createGuestSession() + self.url = control.hostURL + 'api/admins/' + response = api.get(self.session, self.url) + if not response.status_code == 401: + pytest.fail('Expected 401 Unauthorized Error, got {0}.'\ + .format(response.status_code)) + try: + assert response.json()['Message'] == control.AUTHORIZATION_DENIED + except ValueError: + pytest.fail('Expected Json response body, got{0}.'\ + .format(response.text)) + +# Verify that a student can't get information of a specific admin via +# GordonId. +# Pre-condition -- unknown +# Endpoint -- api/admins +# Expected Status Code -- 401 Unauthorized Error +# Expected Response Body -- An authorization denied error + @pytest.mark.skipif(not control.unknownPrecondition, reason = \ + "Hanging on get request") + def test_get_all_admin_as_student(self): + self.session = self.createAuthorizedSession(control.username, control.password) + self.url = control.hostURL + 'api/admins/' + response = api.get(self.session, self.url) + if not response.status_code == 401: + pytest.fail('Expected 401 Unauthorized Error, got {0}.'\ + .format(response.status_code)) + try: + assert response.json()['Message'] == control.AUTHORIZATION_DENIED + except ValueError: + pytest.fail('Expected Json response body, got{0}.'\ + .format(response.text)) + +# Verify that a super admin get information of all admins. +# Endpoint -- api/admin/_id +# Expected Status Code -- 200 OK +# Expected Response Body -- A json response with the student resource + def test_get_admin(self): + self.session = \ + self.createAuthorizedSession(control.leader_username, control.leader_password) + self.url = control.hostURL + 'api/admins/8330171/' + response = api.get(self.session, self.url) + if not response.status_code == 200: + pytest.fail('Expected 200 OK, got {0}.'\ + .format(response.status_code)) + try: + response.json() + except ValueError: + pytest.fail('Expected Json response body, got {0}.'\ + .format(response.text)) + assert response.json()['EMAIL'] == "Chris.Carlson@gordon.edu" + assert response.json()['ADMIN_ID'] == 1 + assert response.json()['ID_NUM'] == 8330171 + assert response.json()['USER_NAME'] == "Chris.Carlson" + assert response.json()['EMAIL'] == "Chris.Carlson@gordon.edu" + assert response.json()['SUPER_ADMIN'] == True + +# Verify that a guest can't get information of all admins. +# Endpoint -- api/admin/_id +# Expected Status Code -- 401 Unauthorized Error +# Expected Response Body -- An authorization denied error + def test_get_guest_admin(self): + self.session = self.createGuestSession() + self.url = control.hostURL + 'api/admins/8330171/' + response = api.get(self.session, self.url) + + if not response.status_code == 401: + pytest.fail('Expected 401 Unauthorized Error, got {0}.'\ + .format(response.status_code)) + try: + assert response.json()['Message'] == control.AUTHORIZATION_DENIED + except ValueError: + pytest.fail('Expected Json response body, got{0}.'\ + .format(response.text)) + +# Verify that a student can't get information of all admins. +# Pre-condition -- unknown +# Endpoint -- api/admin/_id +# Expected Status Code -- 401 Unauthorized Error +# Expected Response Body -- An authorization denied error + @pytest.mark.skipif(not control.unknownPrecondition, reason = \ + "Hanging on get request") + def test_get_student_admin(self): + self.session = self.createAuthorizedSession(control.username, control.password) + self.url = control.hostURL + 'api/admins/8330171' + response = api.get(self.session, self.url) + + if not response.status_code == 401: + pytest.fail('Expected 401 Unauthorized Error, got {0}.'\ + .format(response.status_code)) + try: + assert response.json()['Message'] == control.AUTHORIZATION_DENIED + except ValueError: + pytest.fail('Expected Json response body, got{0}.'\ + .format(response.text)) \ No newline at end of file diff --git a/Tests/ApiEndpoints/test_allaccount_pytest.py b/Tests/ApiEndpoints/test_allaccount_pytest.py new file mode 100644 index 000000000..d5402f79e --- /dev/null +++ b/Tests/ApiEndpoints/test_allaccount_pytest.py @@ -0,0 +1,109 @@ +import pytest +import warnings +import string +from pytest_components import requests +from datetime import datetime + +import pytest_components as api +import test_gordon360_pytest as control + +class Test_AllAccountTest(control.testCase): +# # # # # # # # # +# ACCOUNT TESTS # +# # # # # # # # # + +# Verify that a user can get account by email +# Endpoint -- api/accounts/email/{email} +# Expected Status Code -- 200 OK +# Expected Response Body -- profile of the email person + def test_get_student_by_email(self): + self.session = self.createAuthorizedSession(control.username, control.password) + self.url = control.hostURL + 'api/accounts/email/' + control._email + '/' + response = api.get(self.session, self.url) + + if not response.status_code == 200: + pytest.fail('Expected 200 OK, got {0}.'\ + .format(response.status_code)) + try: + response.json() + except ValueError: + pytest.fail('Expected Json response body, got {0}.'\ + .format(response.text)) + assert response.json()["FirstName"] == control.activity_code_360 + assert response.json()["LastName"] == "StudentTest" + assert response.json()["Email"] == "360.StudentTest@gordon.edu" + assert response.json()["ADUserName"] == "360.StudentTest" + assert response.json()["AccountType"] == "STUDENT" + assert response.json()["Barcode"] == "21607000485992" + assert response.json()["show_pic"] == 0 + assert response.json()["ReadOnly"] == 0 + assert response.json()["account_id"] == 30578 + if "GordonID" in response.json(): + warnings.warn("Security fault, Gordon ID leak") + +# Verify that a user can search someone by a word +# Endpoint -- api/accounts/search/:word +# Expected Status Code -- 200 OK +# Expected Response Body -- any info that has the word + def test_get_search_by_string(self): + self.session = self.createAuthorizedSession(control.username, control.password) + self.url = control.hostURL + 'api/accounts/search/' + control.searchString + '/' + response = api.get(self.session, self.url) + if not response.status_code == 200: + pytest.fail('Expected 200 OK, got {0}.'\ + .format(response.status_code)) + try: + response.json() + except ValueError: + pytest.fail('Expected Json response body, got {0}.'\ + .format(response.text)) + assert response.json()[0]["FirstName"].lower() == control.searchString.lower() + +# Verify that a user can search someone by two words +# Endpoint -- api/accounts/search/:word/:word2 +# Expected Status Code -- 200 OK +# Expected Response Body -- any info that has both of words + def test_get_search_by_two_string(self): + self.session = self.createAuthorizedSession(control.username, control.password) + self.url = control.hostURL + 'api/accounts/search/' + control.searchString + '/' + \ + control.searchString2 + '/' + response = api.get(self.session, self.url) + if not response.status_code == 200: + pytest.fail('Expected 200 OK, got {0}.'\ + .format(response.status_code)) + try: + response.json() + except ValueError: + pytest.fail('Expected Json response body, got {0}.'\ + .format(response.text)) + assert control.searchString in response.json()[0]["FirstName"].lower() + assert control.searchString2 in response.json()[0]["LastName"].lower() + +# Verify that a user can search by username +# Endpoint -- api/accounts/username/{username} +# Expected Status Code -- 200 OK +# Expected Response Body -- profile info of {username} + def test_get_search_by_username(self): + self.session = self.createAuthorizedSession(control.username, control.password) + self.url = control.hostURL + 'api/accounts/username/' + control.leader_username + '/' + response = api.get(self.session, self.url) + if not response.status_code == 200: + pytest.fail('Expected 200 OK, got {0}.'\ + .format(response.status_code)) + try: + response.json() + except ValueError: + pytest.fail('Expected Json response body, got {0}.'\ + .format(response.text)) + assert response.json()["ADUserName"].lower() == control.leader_username.lower() + assert response.json()["FirstName"] == control.activity_code_360 + assert response.json()["LastName"] == control.activity_code_360 + assert response.json()["Email"] == "360.FacultyTest@gordon.edu" + assert response.json()["ADUserName"] == "360.FacultyTest" + assert response.json()["AccountType"] == "FACULTY" + assert response.json()["Barcode"] == "21607000486016" + assert response.json()["show_pic"] == 1 + assert response.json()["ReadOnly"] == 0 + assert response.json()["account_id"] == 30580 + if "GordonID" in response.json(): + warnings.warn("Security fault, Gordon ID leak") \ No newline at end of file diff --git a/Tests/ApiEndpoints/test_allactivities_pytest.py b/Tests/ApiEndpoints/test_allactivities_pytest.py new file mode 100644 index 000000000..0799992ea --- /dev/null +++ b/Tests/ApiEndpoints/test_allactivities_pytest.py @@ -0,0 +1,315 @@ +import pytest +import warnings +import string +from pytest_components import requests +from datetime import datetime + +import pytest_components as api +import test_gordon360_pytest as control + +class Test_AllActivities(control.testCase): +# # # # # # # # # # +# ACTIVITY TESTS # +# # # # # # # # # # + +# Verify that an activity leader can get all activities. +# Endpoint -- api/activities/ +# Expected Status Code -- 200 OK +# Expected Response Body -- List of activities + def test_get_all_activities___activity_leader(self): + self.session = \ + self.createAuthorizedSession(control.leader_username, control.leader_password) + self.url = control.hostURL + 'api/activities/' + response = api.get(self.session, self.url) + if not response.status_code == 200: + pytest.fail('Expected 200 OK , got {0}.'\ + .format(response.status_code)) + try: + response.json() + except ValueError: + pytest.fail('Expected Json response body, got {0}.'\ + .format(response.text)) + if not (type(response.json()) is list): + pytest.fail('Expected list, got {0}.'.format(response.json())) + assert response.json()[0]["ActivityCode"] == control.activity_code_360 + assert response.json()[0]["ActivityDescription"] == \ + control.activity_description_360 + assert response.json()[0]["ActivityImagePath"] == \ + control.activity_image_path_360 + assert response.json()[0]["ActivityBlurb"] == \ + control.activity_blurb_360 + assert response.json()[0]["ActivityURL"] == control.activity_URL_360 + assert response.json()[0]["ActivityType"] == control.activity_type_360 + assert response.json()[0]["ActivityTypeDescription"] == \ + control.activity_type_description_360 + assert response.json()[0]["Privacy"] == False + assert response.json()[0]["ActivityJoinInfo"] == \ + control.activity_join_info_360 + +# Verify that a Guest can get all information for a public activity. +# Endpoint -- api/activities/ +# Expected Status Code -- 200 OK +# Expected Response Body -- List of activities + def test_get_all_activities___Guest(self): + self.session = self.createGuestSession() + self.url = control.hostURL + 'api/activities/360' + response = api.get(self.session, self.url) + if not response.status_code == 200: + pytest.fail('Expected 200 OK , got {0}.'\ + .format(response.status_code)) + try: + response.json() + except ValueError: + pytest.fail('Expected Json response body, got {0}.'\ + .format(response.text)) + assert response.json()["ActivityCode"] == control.activity_code_360 + assert response.json()["ActivityDescription"] == \ + control.activity_description_360 + assert response.json()["ActivityImagePath"] == \ + control.activity_image_path_360 + assert response.json()["ActivityBlurb"] == \ + control.activity_blurb_360 + assert response.json()["ActivityURL"] == control.activity_URL_360 + assert response.json()["ActivityType"] == control.activity_type_360 + assert response.json()["ActivityTypeDescription"] == \ + control.activity_type_description_360 + assert response.json()["Privacy"] == False + assert response.json()["ActivityJoinInfo"] == \ + control.activity_join_info_360 + +# Verify that an activity leader can get all information for a single +# activity. +# Endpoint -- api/activities/{activityCode} +# Expected Status Code -- 200 OK +# Expected Response Body -- Json object with activity resource + def test_get_one_activity___activity_leader(self): + self.session = \ + self.createAuthorizedSession(control.leader_username, control.leader_password) + self.url = control.hostURL + 'api/activities/AJG/' + response = api.get(self.session, self.url) + if not response.status_code == 200: + pytest.fail('Expected 200 OK, got {0}.'\ + .format(response.status_code)) + try: + response.json() + except ValueError: + pytest.fail('Expected Json response body, got {0}.'\ + .format(response.text)) + try: + response.json()['ActivityCode'] + except KeyError: + pytest.fail('Expected ACT_CDE in response, got {0}.'\ + .format(response.json())) + assert response.json()["ActivityCode"] == "AJG" + assert response.json()["ActivityDescription"] == \ + control.activity_description_AJG + assert response.json()["ActivityImagePath"] == \ + control.activity_image_path_AJG + assert response.json()["ActivityBlurb"] == control.activity_blurb_AJG + assert response.json()["ActivityURL"] == control.activity_URL_AJG + assert response.json()["ActivityType"] == control.activity_type_AJG + assert response.json()["ActivityTypeDescription"] == \ + control.activity_type_description_AJG + assert response.json()["Privacy"] == True + assert response.json()["ActivityJoinInfo"] == control.activity_join_info_AJG + +# Verify that an activity leader can get all activities for specific session. +# Endpoint -- api/activities/session/{sessionCode} +# Expected Status Code -- 200 OK +# Expected Response Body -- list of activities + def test_get_activities_for_session___activity_leader(self): + self.session = \ + self.createAuthorizedSession(control.leader_username, control.leader_password) + self.url = control.hostURL + 'api/activities/session/201809/' + response = api.get(self.session, self.url) + + if not response.status_code == 200: + pytest.fail('Expected 200 OK, got {0}.'.format(response.json())) + try: + response.json() + except ValueError: + pytest.fail('Expected Json response body, got {0}.'\ + .format(response.json())) + if not (type(response.json()) is list): + pytest.fail('Expected list, got {0}.'.format(response.json())) + assert response.json()[1]["ActivityCode"] == control.activity_code_AJG + assert response.json()[1]["ActivityDescription"] == \ + control.activity_description_AJG + assert response.json()[1]["ActivityImagePath"] == \ + control.activity_image_path_AJG + assert response.json()[1]["ActivityBlurb"] == \ + control.activity_blurb_AJG + assert response.json()[1]["ActivityURL"] == control.activity_URL_AJG + assert response.json()[1]["ActivityType"] == control.activity_type_AJG + assert response.json()[1]["ActivityTypeDescription"] == \ + control.activity_type_description_AJG + assert response.json()[1]["Privacy"] == None + assert response.json()[1]["ActivityJoinInfo"] == \ + control.activity_join_info_AJG + +# Verify that an activity leader can get all activity types for specific +# session in a list +# Endpoint -- api/activities/session/{sessionCode}/types +# Expected Status Code -- 200 OK +# Expected Response Body -- list of activities + def test_get_activities_for_session_list___activity_leader(self): + self.session = \ + self.createAuthorizedSession(control.leader_username, control.leader_password) + self.url = control.hostURL + 'api/activities/session/201809/types/' + self.sessionID = -1 + + response = api.get(self.session, self.url) + if not response.status_code == 200: + pytest.fail('Expected 200 OK, got {0}.'.format(response.json())) + try: + response.json() + except ValueError: + pytest.fail('Expected Json response body, got {0}.'\ + .format(response.json())) + if not (type(response.json()) is list): + pytest.fail('Expected list, got {0}.'.format(response.json())) + assert "Student Club" == response.json()[6] + assert "Scholarship" == response.json()[4] + assert "Service Learning Project" == response.json()[5] + assert "Student Ministry" == response.json()[10] + assert "Athletic Club" == response.json()[0] + assert "Leadership Program" == response.json()[1] + assert "Music Group" == response.json()[2] + assert "Residence Life" == response.json()[3] + assert "Student Life" == response.json()[8] + assert "Student Organization" == response.json()[11] + assert "Theatre Production" == response.json()[12] + assert "Student Media" == response.json()[9] + assert "Student Government" == response.json()[7] + +# Verify that an activity leader can get the status of activity in a session +# Endpoint -- api/activities/{sessionCode}/{id}/status +# Expected Status Code -- 200 OK +# Expected Response Body -- "closed" or "open" + def test_get_activities_for_session_status___activity_leader(self): + self.session = \ + self.createAuthorizedSession(control.leader_username, control.leader_password) + self.url = control.hostURL + 'api/activities/201809/AJG/status/' + + response = api.get(self.session, self.url) + if not response.status_code == 200: + pytest.fail('Expected 200 OK, got {0}.'.format(response.json())) + try: + response.json() + except ValueError: + pytest.fail('Expected string response body, got {0}.'\ + .format(response.json())) + assert response.json() == "CLOSED" + +# Verify that an activity leader can get all open status activities +# Endpoint -- api/activities/open +# Expected Status Code -- 200 OK +# Expected Response Body -- a list of open activities + def test_get_activities_for_session_open___activity_leader(self): + self.session = \ + self.createAuthorizedSession(control.leader_username, control.leader_password) + self.url = control.hostURL + 'api/activities/open/' + + response = api.get(self.session, self.url) + if not response.status_code == 200: + pytest.fail('Expected 200 OK, got {0}.'.format(response.json())) + try: + response.json() + except ValueError: + pytest.fail('Expected string response body, got {0}.'\ + .format(response.json())) + assert response.json()[0]["ActivityCode"] == control.activity_code_360 + assert response.json()[0]["ActivityDescription"] == \ + control.activity_description_360 + assert response.json()[0]["ActivityImagePath"] == \ + control.activity_image_path_360 + assert response.json()[0]["ActivityBlurb"] == control.activity_blurb_360 + assert response.json()[0]["ActivityURL"] == control.activity_URL_360 + +# Verify that an activity leader can get all closed status activities +# Endpoint -- api/activities/closed +# Expected Status Code -- 200 OK +# Expected Response Body -- "closed" activities + def test_get_activities_for_session_closed___activity_leader(self): + self.session = \ + self.createAuthorizedSession(control.leader_username, control.leader_password) + self.url = control.hostURL + 'api/activities/closed/' + self.sessionID = -1 + + response = api.get(self.session, self.url) + if not response.status_code == 200: + pytest.fail('Expected 200 OK, got {0}.'.format(response.json())) + try: + response.json() + except ValueError: + pytest.fail('Expected string response body, got {0}.'\ + .format(response.json())) + +# Verify that an activity leader can get all open status activities per +# session +# Endpoint -- api/activities/sessioncode}/open +# Expected Status Code -- 200 OK +# Expected Response Body -- activities that are open + def test_get_open_activities_for_session___activity_leader(self): + self.session = \ + self.createAuthorizedSession(control.leader_username, control.leader_password) + self.url = control.hostURL + 'api/activities/201809/open/' + self.sessionID = -1 + + response = api.get(self.session, self.url) + if not response.status_code == 200: + pytest.fail('Expected 200 OK, got {0}.'.format(response.json())) + try: + response.json() + except ValueError: + pytest.fail('Expected string response body, got {0}.'\ + .format(response.json())) + +# Verify that an activity leader can get all closed status activities per +# session +# Endpoint -- api/activities/sessioncode}/closed +# Expected Status Code -- 200 OK +# Expected Response Body -- activities that are closed + def test_get_closed_activities_for_session___activity_leader(self): + self.session = \ + self.createAuthorizedSession(control.leader_username, control.leader_password) + self.url = control.hostURL + 'api/activities/' + control.session_code + '/open/' + self.sessionID = -1 + + response = api.get(self.session, self.url) + if not response.status_code == 200: + pytest.fail('Expected 200 OK, got {0}.'.format(response.json())) + try: + response.json() + except ValueError: + pytest.fail('Expected string response body, got {0}.'\ + .format(response.json())) + +# Verify that an activity leader can update activity information. +# Endpoints -- api/activities/:id +# Expected Status Code -- 200 Ok +# Expected Response Body -- Updated activity information + def test_update_activity___activity_leader(self): + self.session = \ + self.createAuthorizedSession(control.leader_username, control.leader_password) + self.url = control.hostURL + 'api/activities/' + control.activity_code_AJG + '/' + self.data = { + "ACT_CDE" : control.activity_code_AJG, + "ACT_BLURB" : control.activity_blurb_AJG, + "ACT_URL" : control.activity_URL_AJG + } + + response = api.putAsJson(self.session, self.url , self.data) + if not response.status_code == 200: + pytest.fail('Expected 200 OK, got {0}.'\ + .format(response.status_code)) + try: + response.json() + except ValueError: + pytest.fail('Expected json in response body, got {0}.'\ + .format(response.text)) + try: + response.json()['ACT_CDE'] + except ValueError: + pytest.fail('Expected ACT_CDE in response body, got {0}.'\ + .format(response.json())) \ No newline at end of file diff --git a/Tests/ApiEndpoints/test_allauthentication_pytest.py b/Tests/ApiEndpoints/test_allauthentication_pytest.py new file mode 100644 index 000000000..b9e3f9364 --- /dev/null +++ b/Tests/ApiEndpoints/test_allauthentication_pytest.py @@ -0,0 +1,60 @@ +import pytest +import warnings +import string +from pytest_components import requests +from datetime import datetime + +import pytest_components as api +import test_gordon360_pytest as control + +class Test_AllAuthenticationTest(control.testCase): +# # # # # # # # # # # # # +# AUTHENTICATION TESTS # +# # # # # # # # # # # # # + +# Given valid credentials, verify that authentication is successful for a +# student/member. +# Endpoint -- token/ +# Expected Status code -- 200 Ok +# Expected Content -- Json Object with access_token attribute. + def test_authenticate_with_valid_credentials_as_student(self): + self.session = requests.Session() + self.url = control.hostURL + 'token' + self.token_payload = { 'username':control.username, 'password':control.password, \ + 'grant_type':'password' } + response = api.post(self.session, self.url, self.token_payload) + + if not response.status_code == 200: + pytest.fail('Expected 200 OK, got {0}.'\ + .format(response.status_code)) + try: + response.json() + except ValueError: + pytest.fail('Expected Json, got {0}.'.format(response.text)) + if not 'access_token' in response.json(): + pytest.fail('Expected access token in response, got {0}.'\ + .format(response.json())) + assert response.json()["token_type"] == "bearer" + +# Given valid credentials, verify that authentication is successful for a +# faculty/leader/god. +# Endpoint -- token/ +# Expected Status code -- 200 Ok +# Expected Content -- Json Object with access_token attribute. + def test_authenticate_with_valid_credentials___activity_leader(self): + self.session = requests.Session() + self.url = control.hostURL + 'token' + self.token_payload = { 'username':control.leader_username, \ + 'password':control.leader_password, 'grant_type':'password' } + response = api.post(self.session, self.url, self.token_payload) + if not response.status_code == 200: + pytest.fail('Expected 200 OK, got {0}.'\ + .format(response.status_code)) + try: + response.json() + except ValueError: + pytest.fail('Expected Json, got {0}.'.format(response.text)) + if not 'access_token' in response.json(): + pytest.fail('Expected access token in response, got {0}.'\ + .format(response.json())) + assert response.json()["token_type"] == "bearer" \ No newline at end of file diff --git a/Tests/ApiEndpoints/test_alldining_pytest.py b/Tests/ApiEndpoints/test_alldining_pytest.py new file mode 100644 index 000000000..04580f16a --- /dev/null +++ b/Tests/ApiEndpoints/test_alldining_pytest.py @@ -0,0 +1,70 @@ +import pytest +import warnings +import string +from pytest_components import requests +from datetime import datetime + +import pytest_components as api +import test_gordon360_pytest as control + +class Test_AllDiningTest(control.testCase): +# # # # # # # # # +# DINING TESTS # +# # # # # # # # # + +# Verify that a student user can get meal plan data. +# Endpoint -- api/dining/ +# Expected Status Code -- 200 OK +# Expected Response Body -- A json response with dict containing the +# student mealplan data + def test_dining_plan_for_student(self): + self.session = self.createAuthorizedSession(control.username, control.password) + self.url = control.hostURL + 'api/dining/' + response = api.get(self.session, self.url) + if not response.status_code == 200: + pytest.fail('Expected 200 OK, got {0}.'\ + .format(response.status_code)) + try: + response.json() + except ValueError: + pytest.fail('Expected Json response body, got {0}.'\ + .format(response.text)) + assert response.json() == "0" + +# Verify that a faculty user can get meal plan data. +# Endpoint -- api/dining/ +# Expected Status Code -- 200 OK +# Expected Response Body -- A json response with dict containing the +# student mealplan data + def test_dining_plan_for_faculty(self): + self.session = \ + self.createAuthorizedSession(control.leader_username, control.leader_password) + self.url = control.hostURL + 'api/dining/' + response = api.get(self.session, self.url) + if not response.status_code == 200: + pytest.fail('Expected 200 OK, got {0}.'\ + .format(response.status_code)) + try: + response.json() + except ValueError: + pytest.fail('Expected Json response body, got {0}.'\ + .format(response.text)) + assert response.json() == "0" + +# Verify that a guest user can't get meal plan data. +# Endpoint -- api/dining/ +# Expected Status Code -- 401 Unauthorized Error +# Expected Response Body -- An authorization denied message + def test_dining_plan_for_guest(self): + self.session = self.createGuestSession() + self.url = control.hostURL + 'api/dining/' + response = api.get(self.session, self.url) + + if not response.status_code == 401: + pytest.fail('Expected 401 Unauthorized Error, got {0}.'\ + .format(response.status_code)) + try: + assert response.json()['Message'] == control.AUTHORIZATION_DENIED + except ValueError: + pytest.fail('Expected Json response body, got{0}.'\ + .format(response.text)) \ No newline at end of file diff --git a/Tests/ApiEndpoints/test_allemail_pytest.py b/Tests/ApiEndpoints/test_allemail_pytest.py new file mode 100644 index 000000000..e8e27c3b4 --- /dev/null +++ b/Tests/ApiEndpoints/test_allemail_pytest.py @@ -0,0 +1,168 @@ +import pytest +import warnings +import string +from pytest_components import requests +from datetime import datetime + +import pytest_components as api +import test_gordon360_pytest as control + +class Test_AllEmailTest(control.testCase): +# # # # # # # # +# EMAIL TEST # +# # # # # # # # + +# Verify that a student member can get a list of the emails for all members +# in the activity. +# Endpoint -- api/emails/activity/{activity_ID} +# Expected Status Code -- 200 OK +# Expected Response Body -- A json response with the student resource + def test_get_list_of_emails(self): + self.session = self.createAuthorizedSession(control.username, control.password) + self.url = control.hostURL + 'api/emails/activity/' + control.activity_code_AJG + '/' + response = api.get(self.session, self.url) + if not response.status_code == 200: + pytest.fail('Expected 200 OK, got {0}.'\ + .format(response.status_code)) + try: + response.json() + except ValueError: + pytest.fail('Expected Json response body, got{0}.'\ + .format(response.text)) + assert response.json()[0]["FirstName"] == "Christopher" + assert response.json()[0]["LastName"] == "Carlson" + assert response.json()[0]["Email"] == "Chris.Carlson@gordon.edu" + +# Verify that an activity leader can get the emails for the members of an +# activity in specific session code +# Endpoint -- api/emails/activity/:id +# Expected Status Code -- 200 OK +# Expected Response Body -- A list of json objects + def test_get_emails_for_activity___activity_leader(self): + self.session = \ + self.createAuthorizedSession(control.leader_username, control.leader_password) + self.url = control.hostURL + 'api/emails/activity/' + control.activity_code_AJG + \ + '/session/201809/' + response = api.get(self.session, self.url) + if not response.status_code == 200: + pytest.fail('Expected 200 OK, got {0}.'\ + .format(response.status_code)) + try: + response.json() + except ValueError: + pytest.fail('Expected Json in response body, got {0}.'\ + .format(response.text)) + if not (type(response.json()) is list): + pytest.fail('Expected list, got {0}.'.format(response.json)) + assert response.json()[0]['Email'] == "Chris.Carlson@gordon.edu" + assert response.json()[1]['Email'] == "Emmy.Short@gordon.edu" + +# Verify that a supervisor can get the emails for any activity leader based +# on a session code +# Endpoint -- api/emails/activity/:id/leaders/session/:sessionCode +# Expected Status Code -- 200 OK +# Expected Response Body -- Json response with a list of emails + def test_get_emails_for_leaders___supervisor(self): + self.session = \ + self.createAuthorizedSession(control.leader_username, control.leader_password) + self.url = control.hostURL + 'api/emails/activity/' + control.activity_code_AJG + \ + '/leaders/session/201809/' + + response = api.get(self.session, self.url) + if not response.status_code == 200: + pytest.fail('Expected 200 OK, got {0}.'\ + .format(response.status_code)) + try: + response.json() + except ValueError: + pytest.fail('Expected Json response body, got {0}.'\ + .format(response.text)) + assert response.json()[0]['Email'] == "Emmy.Short@gordon.edu" + assert response.json()[0]['FirstName'] == "Emmy" + assert response.json()[0]['LastName'] == "Short" + +# Verify that a leader can get the advisor for a student's involvement based +# on activity code and session code. +# Endpoint -- api/emails/activity/AJG/advisors/session/201809 +# Expected Status Code -- 200 OK +# Expected Response Body -- A json response with the student resource + def test_get_student_by_email___advisor(self): + self.session = \ + self.createAuthorizedSession(control.leader_username, control.leader_password) + self.url = control.hostURL + 'api/emails/activity/' + control.activity_code_AJG + \ + '/advisors/session/201809' + response = api.get(self.session, self.url) + if not response.status_code == 200: + pytest.fail('Expected 200 OK, got {0}.'\ + .format(response.status_code)) + try: + response.json() + except ValueError: + pytest.fail('Expected Json response body, got{0}.'\ + .format(response.text)) + assert response.json()[0]['Email'] == "Chris.Carlson@gordon.edu" + assert response.json()[0]['FirstName'] == "Christopher" + assert response.json()[0]['LastName'] == "Carlson" + +# Verify that a supervisor can get the emails for any advisor +# Endpoint -- api/emails/activity/:id/advisor +# Expected Status Code -- 200 OK +# Expected Response Body -- Json response with a list of emails + def test_get_all_advisor_emails___supervisor(self): + self.session = \ + self.createAuthorizedSession(control.leader_username, control.leader_password) + self.url = control.hostURL + 'api/emails/activity/' + control.activity_code_AJG + \ + '/advisors/' + response = api.get(self.session, self.url) + if not response.status_code == 200: + pytest.fail('Expected 200 OK, got {0}.'\ + .format(response.status_code)) + try: + response.json() + except ValueError: + pytest.fail('Expected Json response body, got {0}.'\ + .format(response.text)) + assert response.json()[0]['Email'] == "Chris.Carlson@gordon.edu" + assert response.json()[0]['FirstName'] == "Christopher" + assert response.json()[0]['LastName'] == "Carlson" + +# Verify that a supervisor can get the emails for any advisors based on +# session code +# Endpoint -- api/emails/activity/:id/advisors/session/{sessioncode} +# Expected Status Code -- 200 OK +# Expected Response Body -- Json response with a list of emails + def test_get_emails_for_group_admin___supervisor(self): + self.session = \ + self.createAuthorizedSession(control.leader_username, control.leader_password) + self.url = control.hostURL + 'api/emails/activity/' + control.activity_code_AJG + \ + '/advisors/session/201809/' + response = api.get(self.session, self.url) + if not response.status_code == 200: + pytest.fail('Expected 200 OK, got {0}.'\ + .format(response.status_code)) + try: + response.json() + except ValueError: + pytest.fail('Expected Json response body, got {0}.'\ + .format(response.text)) + assert response.json()[0]['Email'] == "Chris.Carlson@gordon.edu" + assert response.json()[0]['FirstName'] == "Christopher" + assert response.json()[0]['LastName'] == "Carlson" + +# Verify that a 404 Not Found error message will be returned based on a +# bad session code +# Precondition -- Shouldn't return anything if activity id isn't valid +# Endpoint -- api/emails/activity/:id +# Expected Status Code -- 404 Not Found +# Expected Response Body -- Not Found error message + @pytest.mark.skipif(not control.unknownPrecondition, reason = "Shouldn't allow access"\ + " because the activity id doesn't exist") + def test_get_emails_for_activity_404(self): + self.session = \ + self.createAuthorizedSession(control.leader_username, control.leader_password) + self.url = control.hostURL + 'api/emails/activity/thisIsATest' + response = api.get(self.session, self.url) + if not response.status_code == 404: + pytest.fail('Expected 404 Not Found, got {0}.'\ + .format(response.status_code)) + #try: Don't know exact error message yet \ No newline at end of file diff --git a/Tests/ApiEndpoints/test_allevents_pytest.py b/Tests/ApiEndpoints/test_allevents_pytest.py new file mode 100644 index 000000000..dd1580387 --- /dev/null +++ b/Tests/ApiEndpoints/test_allevents_pytest.py @@ -0,0 +1,196 @@ +import pytest +import warnings +import string +from pytest_components import requests +from datetime import datetime + +import pytest_components as api +import test_gordon360_pytest as control + +class Test_AllEventsTest(control.testCase): +# # # # # # # # # # # # +# EVENTS & CLAW TESTS # +# # # # # # # # # # # # + +# Verify that a student can get all their own chapel events +# Endpoint -- api/events/chapel +# Expected Status Code -- 200 OK +# Expected Response Body -- list of all chapel events attended by the user + def test_get_all_chapel_events(self): + self.session = self.createAuthorizedSession(control.username, control.password) + self.url = control.hostURL + 'api/events/chapel/' + response = api.get(self.session, self.url) + if not response.status_code == 200: + pytest.fail('Expected 200 OK, got {0}.'\ + .format(response.status_code)) + try: + response.json() + except ValueError: + pytest.fail('Expected Json response body, got {0}.'\ + .format(response.text)) + if not (type(response.json()) is list): + pytest.fail('Expected list, got {0}.'.format(response.json())) + +# Verify that a user can get all chapel events in specific term (ex: FA16) +# Endpoint -- api/events/chapel/:term +# Expected Status Code -- 200 OK +# Expected Response Body -- list of all chapel events attended by the user +# during term + def test_get_all_chapel_events_during_term(self): + self.session = self.createAuthorizedSession(control.username, control.password) + self.url = control.hostURL + 'api/events/chapel/' + control.term_code + '/' + response = api.get(self.session, self.url) + + if not response.status_code == 200: + pytest.fail('Expected 200 OK, got {0}.'\ + .format(response.status_code)) + try: + response.json() + except ValueError: + pytest.fail('Expected Json response body, got {0}.'\ + .format(response.text)) + if not (type(response.json()) is list): + pytest.fail('Expected list, got {0}.'.format(response.json())) + +# Verify that a 404 Not Found Error message will be shown when an invalid +# term code is used +# Precondition -- Will still give 200 OK when term code is fake +# Endpoint -- api/events/chapel/{term} +# Expected Status Code -- 404 Not Found +# Expected Response Body -- Not Found error message + @pytest.mark.skipif(not control.unknownPrecondition, reason = "Still returns" + \ + "200 OK regardless of term code") + def test_get_all_chapel_events_fake_term(self): + self.session = self.createAuthorizedSession(control.username, control.password) + self.url = control.hostURL + 'api/events/chapel/thisIsAFakeTermCode/' + response = api.get(self.session, self.url) + + if not response.status_code == 404: + pytest.fail('Expected 404 Not Found, got {0}.'\ + .format(response.status_code)) + #try: Not sure of error message yet + +# Verify that a user can get all events by type_ID +# Endpoint -- api/events/25Live/type/:Event_OR_Type_ID +# Expected Status Code -- 200 OK +# Expected Response Body -- list of all events resources + def test_get_all_events___regular_member(self): + self.session = self.createAuthorizedSession(control.username, control.password) + self.url = control.hostURL + 'api/events/25Live/type/10' + response = api.get(self.session, self.url) + + if not response.status_code == 200: + pytest.fail('Expected 200 OK, got {0}.'\ + .format(response.status_code)) + try: + response.json() + except ValueError: + pytest.fail('Expected Json response body, got {0}.'\ + .format(response.text)) + if not (type(response.json()) is list): + pytest.fail('Expected list, got {0}.'.format(response.json())) + +# Verify that a user can get all events by multiple type_ID +# Endpoint -- api/events/25Live/type/:Event_OR_Type_ID +# Expected Status Code -- 200 OK +# Expected Response Body -- list of all events resources + def test_get_all_events_multiple(self): + self.session = self.createAuthorizedSession(control.username, control.password) + self.url = control.hostURL + 'api/events/25Live/type/10$11$12$14' + response = api.get(self.session, self.url) + + if not response.status_code == 200: + pytest.fail('Expected 200 OK, got {0}.'\ + .format(response.status_code)) + try: + response.json() + except ValueError: + pytest.fail('Expected Json response body, got {0}.'\ + .format(response.text)) + if not (type(response.json()) is list): + pytest.fail('Expected list, got {0}.'.format(response.json())) + +# Verify that a regular member can get all upcoming chapel events +# (category_ID = 85) +# Endpoint -- api/events/25Live/CLAW +# Expected Status Code -- 200 OK +# Expected Response Body -- list of all events resources + def test_get_all_claw(self): + self.session = self.createAuthorizedSession(control.username, control.password) + self.url = control.hostURL + 'api/events/25Live/CLAW' + response = api.get(self.session, self.url) + if not response.status_code == 200: + pytest.fail('Expected 200 OK, got {0}.'\ + .format(response.status_code)) + try: + response.json() + except ValueError: + pytest.fail('Expected Json response body, got {0}.'\ + .format(response.text)) + if not (type(response.json()) is list): + pytest.fail('Expected list, got {0}.'.format(response.json())) + +# Verify that a user can get all events in 25Live under predefined +# categories +# Endpoint -- api/events/25Live/All +# Expected Status Code -- 200 OK +# Expected Response Body -- list of all events resources + def test_get_all_25Live(self): + self.session = self.createAuthorizedSession(control.username, control.password) + self.url = control.hostURL + 'api/events/25Live/All' + response = api.get(self.session, self.url) + if not response.status_code == 200: + pytest.fail('Expected 200 OK, got {0}.'\ + .format(response.status_code)) + try: + response.json() + except ValueError: + pytest.fail('Expected Json response body, got {0}.'\ + .format(response.text)) + if not (type(response.json()) is list): + pytest.fail('Expected list, got {0}.'.format(response.json())) + +# Verify that a user can get information on specific event on 25Live +# Endpoint -- api/events/25Live/:Event_ID (2911 = Chapel) +# Expected Status Code -- 200 OK +# Expected Response Body -- list of all events resources +# This endpoint doesn't seem to be active + def test_get_all_25Live_by_event_id(self): + self.session = self.createAuthorizedSession(control.username, control.password) + self.url = control.hostURL + 'api/events/25Live/2911' + response = api.get(self.session, self.url) + if not response.status_code == 200: + pytest.fail('Expected 200 OK, got {0}.'\ + .format(response.status_code)) + try: + response.json() + except ValueError: + pytest.fail('Expected Json response body, got {0}.'\ + .format(response.text)) + if not (type(response.json()) is list): + pytest.fail('Expected list, got {0}.'.format(response.json())) + assert response.json()[0]['Organization'] == "Chapel Office" + assert response.json()[0]['Event_ID'] == '2911' + assert response.json()[0]['Event_Name'] == 'Chapel' + assert response.json()[0]['Event_Title'] == 'Chapel: David Kirika' + assert response.json()[0]['Event_Type_Name'] == 'Chapel/Worship' + +# Verify that a Guest can only get the public events on 25Live +# Endpoint -- api/events/25Live/Public +# Expected Status Code -- 200 OK +# Expected Response Body -- list of all guest events resources + def test_get_all_public_events(self): + self.session = self.createGuestSession() + self.url = control.hostURL + 'api/events/25Live/Public' + response = api.get(self.session, self.url) + if not response.status_code == 200: + pytest.fail('Expect 200 OK, got {0}.'.format(response.status_code)) + try: + response.json() + except ValueError: + pytest.fail('Expected Json response body, got {0}.'\ + .format(response.text)) + if not (type(response.json()) is list): + pytest.fail('Expected list, got {0}.'.format(response.json())) + for i in range(len(response.json())): + assert response.json()[i]['Requirement_Id'] == '3' \ No newline at end of file diff --git a/Tests/ApiEndpoints/test_allmembership_pytest.py b/Tests/ApiEndpoints/test_allmembership_pytest.py new file mode 100644 index 000000000..9cd83e758 --- /dev/null +++ b/Tests/ApiEndpoints/test_allmembership_pytest.py @@ -0,0 +1,639 @@ +import pytest +import warnings +import string +from pytest_components import requests +from datetime import datetime + +import pytest_components as api +import test_gordon360_pytest as control + +class Test_AllMembershipTest(control.testCase): +# # # # # # # # # # # +# MEMBERSHIP TESTS # +# # # # # # # # # # # + +# Test retrieving all membership resources as a leader +# Endpoint -- memberships/ +# Expected Status code -- 200 Ok +# Expected Content -- List of all memberships + def test_get_all_memberships___activity_leader(self): + self.session = \ + self.createAuthorizedSession(control.leader_username, control.leader_password) + self.url = control.hostURL + 'api/memberships/' + response = api.get(self.session, self.url) + if not response.status_code == 200: + pytest.fail('Expected 200 OK, got {0}.'\ + .format(response.status_code)) + try: + response.json() + except ValueError: + pytest.fail('Expected Json response, got {0}.'\ + .format(response.text)) + if not (type(response.json()) is list): + pytest.fail('Response was not a list') + assert response.json()[0]["ActivityCode"] == control.activity_code_360 + assert response.json()[0]["ActivityDescription"] == \ + control.activity_description_360 + +# Test retrieving all membership resources as a member +# Endpoint -- memberships/ +# Expected Status code -- 401 Unauthorized + def test_get_all_memberships___regular_member(self): + self.session = self.createAuthorizedSession(control.username, control.password) + self.url = control.hostURL + 'api/memberships/' + response = api.get(self.session, self.url) + + if not response.status_code == 401: + pytest.fail('Expected 401 Unauthorized, got {0}.'\ + .format(response.status_code)) + +# Retrieve a specific membership resource as a leader +# Endpoint -- api/memberships/:id +# Expected Status Code -- 200 OK +# Expected Content -- A Json Object with a MembershipID attribute. + def test_get_one_membership___activity_leader(self): + self.session = \ + self.createAuthorizedSession(control.leader_username, control.leader_password) + self.url = control.hostURL + 'api/memberships/' + self.membershipID = -1 + # Find a valid membership id + response = api.get(self.session, self.url) + if not response.status_code == 200: + pytest.fail('Expected 200 OK, got {0}.'\ + .format(response.status_code)) + try: + response.json() + except ValueError: + pytest.fail('Expected json response body, got {0}.'\ + .format(response.text)) + if "IDNumber" in response.json()[0]: + warnings.warn("Security fault, Gordon ID leak") + +# Verify that a leader can fetch memberships for an activity. +# Endpoint -- api/memberships/activity/{activityId} +# Expected Status Code -- 200 OK +# Expected Response Content -- A list of json Objects. + def test_get_memberships_for_an_activity___activity_leader(self): + self.session = \ + self.createAuthorizedSession(control.leader_username, control.leader_password) + self.url = control.hostURL + 'api/memberships/activity/' + control.activity_code_AJG + '/' + response = api.get(self.session, self.url) + if not response.status_code == 200: + pytest.fail('Expected 200 OK, got {0}.'\ + .format(response.status_code)) + try: + response.json() + except ValueError: + pytest.fail('Expected Json response body, got {0}.'\ + .format(response.text)) + if not (type(response.json()) is list): + pytest.fail('Response was not a list.') + assert response.json()[0]["ActivityCode"] == control.activity_code_AJG + if "IDNumber" in response.json()[0]: + warnings.warn("Security fault, Gordon ID leak") + +# Verify that a member can fetch memberships for an activity. +# Endpoint -- api/memberships/activity/{activityId} +# Expected Status Code -- 200 OK +# Expected Response Content -- A list of json Objects. + def test_get_memberships_for_an_activity___regular_member(self): + self.session = self.createAuthorizedSession(control.username, control.password) + self.url = control.hostURL + 'api/memberships/activity/' + control.activity_code_AJG + '/' + response = api.get(self.session, self.url) + if not response.status_code == 200: + warnings.warn("Security fault") + pytest.fail('Expected 200 OK, got {0}.'\ + .format(response.status_code)) + +# Verify that a member can get all group admins +# Endpoint -- api/memberships/activity/{activityId}/group-admin +# Expected Status Code -- 200 OK +# Expected Response Content -- A list of json Objects. + def test_get_admins_for_an_activity___regular_member(self): + self.session = self.createAuthorizedSession(control.username, control.password) + self.url = control.hostURL + 'api/memberships/activity/' + control.activity_code_AJG + \ + '/group-admin/' + response = api.get(self.session, self.url) + if not response.status_code == 200: + pytest.fail('Expected 200 OK, got {0}.'\ + .format(response.status_code)) + try: + response.json() + except ValueError: + pytest.fail('Expected Json response body, got {0}.'\ + .format(response.text)) + if not (type(response.json()) is list): + pytest.fail('Response was not a list.') + assert response.json()[0]["ActivityCode"] == control.activity_code_AJG + if "IDNumber" in response.json()[0]: + warnings.warn("Security fault, Gordon ID leak") + +# Verify that a regular member can fetch all leaders for a specific activity. +# Endpoint -- api/memberships/activity/:id/leaders +# Expected Status Code -- 200 OK +# Expected Response Content -- A list of json objects. + def test_get_leader_memberships_for_an_activity___regular_member(self): + self.session = self.createAuthorizedSession(control.username, control.password) + self.url = control.hostURL + 'api/memberships/activity/' + control.activity_code_AJG + \ + '/leaders/' + response = api.get(self.session, self.url) + if not response.status_code == 200: + pytest.fail('Expected 200 OK, got {0}.'\ + .format(response.status_code)) + try: + response.json() + assert response.json()[0]['Participation'] == "LEAD" + except ValueError: + pytest.fail('Expected Json response body, got {0}.'\ + .format(response.text)) + if not (type(response.json()) is list): + pytest.fail('Response was not a list.') + if "IDNumber" in response.json()[0]: + warnings.warn("Security fault, Gordon ID leak") + +# Verify that a regular member can fetch all advisors for a specific activity. +# Endpoint -- api/memberships/activity/:id/advisors +# Expected Status Code -- 200 OK +# Expected Response Content -- A list of json objects. + def test_get_advisors_memberships_for_an_activity___regular_member(self): + self.session = self.createAuthorizedSession(control.username, control.password) + self.url = control.hostURL + 'api/memberships/activity/' + control.activity_code_AJG + \ + '/advisors/' + response = api.get(self.session, self.url) + if not response.status_code == 200: + pytest.fail('Expected 200 OK, got {0}.'\ + .format(response.status_code)) + try: + response.json() + except ValueError: + pytest.fail('Expected Json response body, got {0}.'\ + .format(response.text)) + if not (type(response.json()) is list): + pytest.fail('Response was not a list.') + if "IDNumber" in response.json()[0]: + warnings.warn("Security fault, Gordon ID leak") + +# Verify that a regular member can fetch number of followers for a specific +# activity. +# Endpoint -- api/memberships/activity/:id/advisors +# Expected Status Code -- 200 OK +# Expected Response Content -- An integer + def test_get_followers_memberships_for_an_activity___regular_member(self): + self.session = self.createAuthorizedSession(control.username, control.password) + self.url = control.hostURL + 'api/memberships/activity/' + control.activity_code_AJG + \ + '/followers/' + response = api.get(self.session, self.url) + if not response.status_code == 200: + pytest.fail('Expected 200 OK, got {0}.'\ + .format(response.status_code)) + try: + response.json() + except ValueError: + pytest.fail('Expected Json response body, got {0}.'\ + .format(response.text)) + +# Verify that a regular member can fetch number of followers for a specific +# activity in a given session +# Endpoint -- api/memberships/activity/:id/advisors +# Expected Status Code -- 200 OK +# Expected Response Content -- An integer + def test_get_followers_memberships_for_an_activity_session___regular_member(self): + self.session = self.createAuthorizedSession(control.username, control.password) + self.url = control.hostURL + 'api/memberships/activity/AJG/followers/201809/' + response = api.get(self.session, self.url) + if not response.status_code == 200: + pytest.fail('Expected 200 OK, got {0}.'\ + .format(response.status_code)) + try: + response.json() + except ValueError: + pytest.fail('Expected Json response body, got {0}.'\ + .format(response.text)) + assert response.json() == 0 + +# Verify that a regular member can fetch number of members for a specific +# activity in a given session +# Endpoint -- api/memberships/activity/:id/advisors +# Expected Status Code -- 200 OK +# Expected Response Content -- An integer + def test_get_members_for_an_activity_session___regular_member(self): + self.session = self.createAuthorizedSession(control.username, control.password) + self.url = control.hostURL + 'api/memberships/activity/AJG/members/201809/' + response = api.get(self.session, self.url) + if not response.status_code == 200: + pytest.fail('Expected 200 OK, got {0}.'\ + .format(response.status_code)) + try: + response.json() + except ValueError: + pytest.fail('Expected Json response body, got {0}.'\ + .format(response.text)) + assert response.json() == 3 + +# Verify that a regular member can fetch number of members for a +# specific activity. +# Endpoint -- api/memberships/activity/:id/members +# Expected Status Code -- 200 OK +# Expected Response Content -- An integer + def test_get_members_for_an_activity___regular_member(self): + self.session = self.createAuthorizedSession(control.username, control.password) + self.url = control.hostURL + 'api/memberships/activity/' + control.activity_code_AJG + \ + '/members/' + response = api.get(self.session, self.url) + if not response.status_code == 200: + pytest.fail('Expected 200 OK, got {0}.'\ + .format(response.status_code)) + try: + response.json() + except ValueError: + pytest.fail('Expected Json response body, got {0}.'\ + .format(response.text)) + assert response.json() == 88 + +# Verify that a leader can fetch memberships associated with them. +# Endpoints -- api/memberships/student/:id +# Expected Status Code -- 200 OK +# Expected Reponse Content -- A list of json objects + def test_get_all_my_memberships___activity_leader(self): + self.session = \ + self.createAuthorizedSession(control.leader_username, control.leader_password) + self.url = \ + control.hostURL + 'api/memberships/student/' + str(control.my_id_number) + '/' + response = api.get(self.session, self.url) + if not response.status_code == 200: + pytest.fail('Expected 200 OK, got {0}.'\ + .format(response.status_code)) + try: + response.json() + except ValueError: + pytest.fail('Expected Json response body, got {0}.'\ + .format(response.text)) + if not (type(response.json()) is list): + pytest.fail('Response was not a list.') + if control.my_id_number != response.json()[0]["IDNumber"]: + warnings.warn("Security fault, not the user's Gordon ID") + +# Verify that a member can fetch memberships based on username +# Endpoints -- api/memberships/student/:id +# Expected Status Code -- 200 OK +# Expected Reponse Content -- A list of json objects + def test_get_memberships_username___activity_leader(self): + self.session = \ + self.createAuthorizedSession(control.leader_username, control.leader_password) + self.url = \ + control.hostURL + 'api/memberships/student/username/' + control.username + '/' + response = api.get(self.session, self.url) + if not response.status_code == 200: + pytest.fail('Expected 200 OK, got {0}.'\ + .format(response.status_code)) + try: + response.json() + except ValueError: + pytest.fail('Expected Json response body, got {0}.'\ + .format(response.text)) + if not (type(response.json()) is list): + pytest.fail('Response was not a list.') + if control.my_id_number != response.json()[0]["IDNumber"]: + warnings.warn("Security fault, not the user's ID") + +# Verify that leader can fetch someone else's memberships. +# Endpoint -- api/memberships/student/:id +# Expected Status Code -- 200 OK. +# Expected Response Content -- A list of json objects. + def test_get_all_memberships_for_someone_else___activity_leader(self): + self.session = \ + self.createAuthorizedSession(control.leader_username, control.leader_password) + self.url = control.hostURL + 'api/memberships/student/' + str(control.valid_id_number) + response = api.get(self.session, self.url) + if not response.status_code == 200: + pytest.fail('Expected 200 OK, got {0}.'\ + .format(response.status_code)) + try: + response.json() + except ValueError: + pytest.fail('Expected Json response body, got {0}.'\ + .format(response.text)) + if not (type(response.json()) is list): + pytest.fail('Response was not a list') + if control.valid_id_number != response.json()[0]["IDNumber"]: + warnings.warn("Security fault, not the user's ID") + +# Verify that an activity leader can create a Guest membership for someone. +# Precondition -- unknown +# Endpoints -- api/memberships/ +# Expected Status Code -- 201 Created. +# Expected Content -- A Json object with a MEMBERSHIP_ID attribute. + @pytest.mark.skipif(not control.unknownPrecondition, reason = "409 Error") + def test_post_new_guest_membership_for_someone_else__activity_leader(self): + self.session = \ + self.createAuthorizedSession(control.leader_username, control.leader_password) + self.url = control.hostURL + 'api/memberships/' + self.data = { + 'ACT_CDE': control.activity_code_AJG, + 'SESS_CDE': control.session_code, + 'ID_NUM': control.valid_id_number, + 'PART_CDE': 'GUEST', + 'BEGIN_DTE': '06/10/2016', + 'END_DTE': '07/16/2016', + 'COMMENT_TXT': control.comments + } + # We will get the actual id when we post. + # Setting it -1 to check later that we got an id from the post. + self.createdMembershipID = -1 + response = api.postAsJson(self.session, self.url, self.data) + if response.status_code == 201: + if not ('MEMBERSHIP_ID' in response.json()): + pytest.fail('Expected MEMBERSHIP_ID in json response, got {0}.'\ + .format(response.json())) + else: + self.createdMembershipID = response.json()['MEMBERSHIP_ID'] + else: + pytest.fail('Expected 201 Created, got {0}.'\ + .format(response.status_code)) + try: + response.json() + except ValueError: + pytest.fail('Expected Json response body, got {0}.'\ + .format(response.text)) + assert response.json()['PART_CDE'] =='GUEST' + api.delete(self.session, self.url + str(self.createdMembershipID)) + +# Verify that an activity leader can create a membership for someone. +# Precondition -- unknown +# Endpoint -- api/memberships/ +# Expected Status Code -- 200 OK +# Expected Content -- A json response with the created membership + @pytest.mark.skipif(not control.unknownPrecondition, reason = "409 Error") + def test_post_new_membership_for_someone___activity_leader(self): + self.session = \ + self.createAuthorizedSession(control.leader_username, control.leader_password) + self.url = control.hostURL + 'api/memberships/' + self.createdMembershipID = -1 + # Add a new participant + self.data = { + 'ACT_CDE': control.activity_code_AJG, + 'SESS_CDE': control.session_code, + 'ID_NUM': control.valid_id_number, + 'PART_CDE': 'MEMBR', + 'BEGIN_DTE': '06/10/2016', + 'END_DTE': '07/16/2016', + 'COMMENT_TXT': control.comments + } + + response = api.postAsJson(self.session, self.url, self.data) + if not response.status_code == 201: + pytest.fail('Expected 201 Created, got {0}.'\ + .format(response.status_code)) + try: + response.json() + except ValueError: + pytest.fail('Expected Json response body, got {0}.'\ + .format(response.text)) + try: + self.createdMembershipID = response.json()['MEMBERSHIP_ID'] + except KeyError: + pytest.fail('Expected MEMBERSHIP ID in response, got {0}.'\ + .format(response.json())) + + #checking the correctness of post + getResponse = api.get(self.session, control.hostURL + \ + 'api/memberships/activity/' + str(control.activity_code_AJG)) + self.membershipID = response.json()['MEMBERSHIP_ID'] + req = getResponse.json() + found = False + for dic in req: + reqID = dic['MembershipID'] + if (reqID == self.membershipID): + found = True + try: + assert dic['ActivityCode'] == control.activity_code_AJG + assert dic['SessionCode'] == control.session_code + assert dic['IDNumber'] == control.valid_id_number + except ValueError: + pytest.fail('Expected Json response body, got{0}.'\ + .format(getResponse.json)) + if not found: + pytest.fail('requestID not found: {0}.'.format(response.json())) + + if self.createdMembershipID >= 0: + api.delete(self.session, self.url + str(self.createdMembershipID)) + +# Verify that an activity leader can assign a new leader +# Precondition -- unknown +# Endpoint -- api/memberships/ +# Expected Status Code -- 200 OK +# Expected Content -- A json response with the created membership + @pytest.mark.skipif(not control.unknownPrecondition, reason = "409 Error") + def test_post_new_leader_membership_for_someone___activity_leader(self): + self.session = \ + self.createAuthorizedSession(control.leader_username, control.leader_password) + self.url = control.hostURL + 'api/memberships/' + self.createdMembershipID = -1 + # Add a new leader + self.data = { + 'ACT_CDE': control.activity_code_AJG, + 'SESS_CDE': control.session_code, + 'ID_NUM': control.valid_id_number, + 'PART_CDE':'LEAD', + 'BEGIN_DTE': control.begin_date, + 'END_DTE': control.end_date, + 'COMMENT_TXT': control.comments + } + response = api.postAsJson(self.session, self.url, self.data) + if not response.status_code == 201: + pytest.fail('Expected 201, got {0}.'.format(response.status_code)) + try: + response.json() + except ValueError: + pytest.fail('Expected Json response body, got {0}.'\ + .format(response.text)) + try: + self.createdMembershipID = response.json()['MEMBERSHIP_ID'] + if self.createdMembershipID < 0: # The creation was not successful + pytest.fail('Expected valid memberhsip ID, got {0}.'\ + .format(self.createdMembershipID)) + else: + #checking if the correctness of post + getResponse = api.get(self.session, control.hostURL + \ + 'api/memberships/activity/' + str(control.activity_code_AJG)) + self.membershipID = response.json()['MEMBERSHIP_ID'] + req = getResponse.json() + found = False + for dic in req: + reqID = dic['MembershipID'] + if (reqID == self.membershipID): + found = True + try: + assert dic['ActivityCode'] == control.activity_code_AJG + assert dic['SessionCode'] == control.session_code + assert dic['IDNumber'] == control.valid_id_number + except ValueError: + pytest.fail('Expected Json response body, got{0}.'\ + .format(getResponse.json)) + if not found: + pytest.fail('MembershipID not found:', self.membershipID) + d = api.delete(self.session, self.url + \ + str(self.createdMembershipID)) + if not d.status_code == 200: + pytest.fail('Error in cleanup. Expected , got {0}.'\ + .format(d.status_code)) + except KeyError: + pytest.fail('Expected MEMBERSHIP ID in response, got {0}.'\ + .format(response.json())) + + + +# Verify that an activity leader can upgrade a normal membership to leader +# status. +# Precondition -- unknown +# Endpoint -- api/memberships/:id +# Expected Status Code -- 200 OK +# Expected Content -- A json object with a MEMBERSHIP_ID attribute. + @pytest.mark.skipif(not control.unknownPrecondition, reason = "Error in setup") + def test_put_edited_membership_member_to_leader___activity_leader(self): + self.session = \ + self.createAuthorizedSession(control.leader_username, control.leader_password) + self.url = control.hostURL + 'api/memberships/' + self.createdMembershipID = -1 + + # The membership to modify + self.predata = { + 'ACT_CDE': control.activity_code_AJG, + 'SESS_CDE' : control.session_code, + 'ID_NUM': control.valid_id_number, + 'PART_CDE':'MEMBR', # Is a participant at first. + 'BEGIN_DTE':'06/10/2016', # Old start date + 'END_DTE':'07/16/2016', + 'COMMENT_TXT': control.comments + } + r = api.postAsJson(self.session, self.url, self.predata) + try: + self.createdMembershipID = r.json()["MEMBERSHIP_ID"] + # Updated Data + self.data = { + 'MEMBERSHIP_ID' : self.createdMembershipID, + 'ACT_CDE': control.activity_code_AJG, + 'SESS_CDE' : control.session_code, + 'ID_NUM': control.valid_id_number, + 'PART_CDE':'LEAD', # Upgrade him to director. + 'BEGIN_DTE':'02/10/2016', # New start date + 'END_DTE':'07/16/2016', + 'COMMENT_TXT': control.comments + } + except (KeyError, ValueError): + pytest.fail('Error in setup.') + response = api.putAsJson(self.session, self.url + \ + str(self.createdMembershipID), self.data) + if not response.status_code == 200: + pytest.fail('Expected 200 OK, got {0}.'\ + .format(response.status_code)) + try: + response.json() + except ValueError: + pytest.fail('Expected Json response body, got {0}.'\ + .format(response.text)) + try: + self.createdMembershipID = response.json()['MEMBERSHIP_ID'] + except KeyError: + pytest.fail('Expected MEMBERSHIP_ID in json response, got {0}.'\ + .format(response.json())) + assert response.json()['PART_CDE'] == 'LEAD' + if self.createdMembershipID >= 0: + api.delete(self.session, self.url + str(self.createdMembershipID)) + +# Verify that an activity leader can demote a leader membership. +# Precondition -- unknown +# Endpoint -- api/memberships/:id +# Expected Status Code -- 200 OK +# Expected Content -- A json object with a MEMBERSHIP_ID attribute. + @pytest.mark.skipif(not control.unknownPrecondition, reason = "Error in setup.") + def test_put_edited_membership_leader_to_member___activity_leader(self): + self.session = \ + self.createAuthorizedSession(control.leader_username, control.leader_password) + self.url = control.hostURL + 'api/memberships/' + self.createdMembershipID = -1 + # The membership to modify + self.predata = { + 'ACT_CDE': control.activity_code_AJG, + 'SESS_CDE' : control.session_code, + 'ID_NUM': control.valid_id_number, + 'PART_CDE':'LEAD', # Is a leader at first + 'BEGIN_DTE':'06/10/2016', # Old start date + 'END_DTE':'07/16/2016', + 'COMMENT_TXT': control.comments + } + r = api.postAsJson(self.session, self.url, self.predata) + try: + self.createdMembershipID = r.json()["MEMBERSHIP_ID"] + # Updated Data + self.data = { + 'MEMBERSHIP_ID' : self.createdMembershipID, + 'ACT_CDE': control.activity_code_AJG, + 'SESS_CDE' : control.session_code, + 'ID_NUM': control.valid_id_number, + 'PART_CDE':'MEMBR', # Demote him to member + 'BEGIN_DTE':'02/10/2016', # New start date + 'END_DTE':'07/16/2016', + 'COMMENT_TXT': control.comments + } + except (KeyError, ValueError): + pytest.fail('Error in setup.') + response = api.putAsJson(self.session, self.url + \ + str(self.createdMembershipID), self.data) + if not response.status_code == 200: + pytest.fail('Expected 200 OK, got {0}.'\ + .format(response.status_code)) + try: + response.json() + except ValueError: + pytest.fail('Expected Json response body, got {0}.'\ + .format(response.text)) + try: + self.createdMembershipID = response.json()['MEMBERSHIP_ID'] + except KeyError: + pytest.fail('Expected MEMBERSHIP_ID in json response, got {0}.'\ + .format(response.json())) + assert response.json()['PART_CDE'] == 'MEMBR' + if self.createdMembershipID >= 0: + api.delete(self.session, self.url + str(self.createdMembershipID)) + +# Verify that an activity leader can delete someone else's membership. +# Predcondition -- unknown +# Endpoint -- api/memberships/ +# Expected Status Code -- 200 OK +# Expected Response Content -- The membership resource that wad deleted. + @pytest.mark.skipif(not control.unknownPrecondition, reason = "Error doing setup.") + def test_delete_valid_membership___activity_leader(self): + self.session = \ + self.createAuthorizedSession(control.leader_username, control.leader_password) + self.url = control.hostURL + 'api/memberships/' + self.createdMembershipID = -1 + + # Create a Memerships that we'll eventually delete + self.predata = { + 'ACT_CDE': control.activity_code_AJG, + 'SESS_CDE' : control.session_code, + 'ID_NUM': control.valid_id_number, + 'PART_CDE':'MEMBR', + 'BEGIN_DTE': control.begin_date, + 'END_DTE': control.end_date, + 'COMMENT_TXT': control.comments + } + r = api.postAsJson(self.session, self.url, self.predata) + try: + self.createdMembershipID = r.json()['MEMBERSHIP_ID'] + except (ValueError, KeyError): + pytest.fail('Error doing setup') + response = \ + api.delete(self.session, self.url + str(self.createdMembershipID)) + if not response.status_code == 200: + pytest.fail('Expected 200 OK, got {0}.'\ + .format(response.status_code)) + try: + response.json() + except ValueError: + pytest.fail('Expected Json response body, got {0}.'\ + .format(response.text)) + if not ('MEMBERSHIP_ID' in response.json()): + pytest.fail('Expected MEMBERSHIP_ID in response, got {0}.'\ + .format(response.json())) diff --git a/Tests/ApiEndpoints/test_allmembershiprequest_pytest.py b/Tests/ApiEndpoints/test_allmembershiprequest_pytest.py new file mode 100644 index 000000000..02266d911 --- /dev/null +++ b/Tests/ApiEndpoints/test_allmembershiprequest_pytest.py @@ -0,0 +1,577 @@ +import pytest +import warnings +import string +from pytest_components import requests +from datetime import datetime + +import pytest_components as api +import test_gordon360_pytest as control + +class Test_AllMembershipRequestTest(control.testCase): +# # # # # # # # # # # # # # +# MEMBERSHIP REQUEST TEST # +# # # # # # # # # # # # # # + +# Verify that a regular member cannot access all membership requests. +# Endpoint -- api/requests/ +# Expected Status Code -- 401 Unauthorized +# Expected Response Content -- Empty response content. + def test_not_get_all_membership_requests(self): + self.session = self.createAuthorizedSession(control.username, control.password) + self.url = control.hostURL + 'api/requests/' + response = api.get(self.session, self.url) + if not response.status_code == 401: + pytest.fail('Expected 401 Unauthorized, got {0}.'\ + .format(response.status_code)) + if response.text: + pytest.fail('Expected empty response body, got {0}.'\ + .format(response.text)) + + +# Verify that a regular member cannot get the membership requests of somone +# else. +# Endpoint -- api/requests/student/:id +# Expected Status Code -- 404 Not Found +# Expected Response Body -- Empty + def test_not_get_membership_requests_for_someone_else(self): + self.session = self.createAuthorizedSession(control.username, control.password) + self.url = control.hostURL + 'api/requests/student/' + str(control.valid_id_number) + response = api.get(self.session, self.url) + if not response.status_code == 404: + pytest.fail('Expected 404 Not Found, got {0}.'.format(response.status_code)) + + +# Verify that a regular member can't access memberships requests for +# activity. +# Endpoint -- api/requests/activity/:id +# Expected Status Code -- 401 Unauthorized +# Expected Response Body -- Empty +# Passed with activity code 'TRAS', but not AJG because studenttest is a +# leader for AJG + def test_not_get_membership_requests_for_activity(self): + self.session = self.createAuthorizedSession(control.username, control.password) + self.url = control.hostURL + 'api/requests/activity/' + 'TRAS' + # Report if there any current memberships for the Club to avoid false + # negatives. + # If I am currently a director of the club, this test should fail. + response = api.get(self.session, control.hostURL + 'api/memberships/student/' \ + + str(control.my_id_number)) + try: + for membership in response.json(): + if(membership['ActivityCode'] == control.activity_code_AJG and \ + membership['Participation'] in control.LEADERSHIP_POSITIONS): + pytest.fail('False Negative: This user is a leader for' + \ + 'the activity we are testing.') + except ValueError: + pytest.fail('We did not get a json response back during setup.') + + response = api.get(self.session, self.url) + if not response.status_code == 401: + pytest.fail('We did not get 401 Unauthorized.') + if response.text: + pytest.fail('We got a non-empty response body.') + + +# Verify that we can create a membership request. +# Precondition -- unknown +# Endpoints -- api/requests/ +# Expected Status Cpde -- 201 Created. +# Expected Content -- A Json object with a REQUEST_ID attribute. +# session code 201510 does not work + @pytest.mark.skipif(not control.unknownPrecondition, reason = "409 Error") + def test_post_valid_membership_request__as_member(self): + self.session = self.createAuthorizedSession(control.username, control.password) + self.url = control.hostURL + 'api/requests/' + self.data = { + 'ACT_CDE': control.activity_code_AJG, + 'SESS_CDE' : control.session_code, + 'ID_NUM': control.my_id_number, + 'PART_CDE':'MEMBR', + 'DATE_SENT' : '06/27/2019', + 'COMMENT_TXT': control.comments + } + # We will get the actual id when we post. + # Setting it -1 to check later that we got an id from the post. + self.requestID = -1 + response = api.postAsJson(self.session, self.url, self.data) + if not response.status_code == 201: + pytest.fail('Expected 201 Created, got {0}.'\ + .format(response.status_code)) + try: + response.json() + except ValueError: + pytest.fail('Expected json response, got {0}.'\ + .format(response.text)) + + #checking if the correctness of post\ + self.session = \ + self.createAuthorizedSession(control.leader_username, control.leader_password) + getResponse = api.get(self.session, control.hostURL + \ + 'api/requests/activity/' + str(control.activity_code_AJG)) + self.requestID = response.json()['REQUEST_ID'] + req = getResponse.json() + found = False + for dic in req: + reqID = dic['RequestID'] + if (reqID == self.requestID): + found = True + try: + assert dic['ActivityCode'] == control.activity_code_AJG + assert dic['SessionCode'] == control.session_code + assert dic['IDNumber'] == control.my_id_number + except ValueError: + pytest.fail('Expected Json response body, got{0}.'\ + .format(getResponse.json)) + if not found: + pytest.fail('requestID not found:', self.requestID) + + #delete the test post + try: + self.requestID = response.json()['REQUEST_ID'] + print(self.requestID) + if self.requestID >= 0: + api.delete(self.session, self.url + str(self.requestID)) + except KeyError: + pytest.fail('Expected REQUEST_ID in response body, got {0}.'\ + .format(response.json())) + + +# Verify that we can't create a membership request for someone else as a +# member. +# Endpoints -- api/requests/ +# Expected Status Code -- 401 Unauthorized. +# Expected Response Content -- Empty Response. +# look up for configuration.py for the data configuration + def test_not_post_membership_request_for_someone_else(self): + self.session = self.createAuthorizedSession(control.username, control.password) + self.url = control.hostURL + 'api/requests/' + self.data = { + 'ACT_CDE': control.activity_code_AJG, + 'SESS_CDE' : control.session_code, + 'ID_NUM': control.valid_id_number, + 'PART_CDE': control.member_positions, + 'DATE_SENT' : '07/06/2016', + 'COMMENT_TXT': control.comments + } + # We will get the actual id when we post. + self.requestID = -1 + response = api.post(self.session, self.url, self.data) + + if response.status_code == 201: + try: + self.requestID = response.json()['REQUEST_ID'] + if self.requestID >= 0: + api.delete(self.session, self.url + str(self.requestID)) + pytest.fail('Request {0} was created even though it was supposed to be unauthorized'.format(self.requestID)) + except (ValueError, KeyError): + pytest.fail('Error in test') + elif not response.status_code == 401: + pytest.fail('Expected 401 Unauthorized, got {0}.'\ + .format(response.status_code)) + + +# Verify that an activity leader can access all membership requests. +# Endpoint -- api/requests/ +# Expected Status Code -- 200 OK +# Expected Response Content -- List of json objects representing the +# membership requests for all. + def test_get_all_membership_requests(self): + self.session = \ + self.createAuthorizedSession(control.leader_username, control.leader_password) + self.url = control.hostURL + 'api/requests/' + response = api.get(self.session, self.url) + if not response.status_code == 200: + pytest.fail('Expected 200 OK, got {0}.'\ + .format(response.status_code)) + try: + assert response.json()[0]['ActivityCode'] == control.activity_code_360 + assert response.json()[1]['ActivityCode'] == "BADM" + assert response.json()[2]['ActivityCode'] == "ACS" + assert response.json()[3]['ActivityCode'] == "SCOTTIE" + except ValueError: + pytest.fail('Expected Json response body, got {0}.'\ + .format(response.text)) + if not (type(response.json()) is list): + pytest.fail('Expected list in response body, got {0}.'\ + .format(response.json())) + + +# Verify that the activity leader can get requests to join the activity +# he/she is leading +# Endpoint -- api/requests/activity/:id +# Expected Status Code -- 200 OK +# Expected Response Body -- List of json objects representing the membership +# requests for an activity. + def test_get_membership_requests_for_activity(self): + self.session = \ + self.createAuthorizedSession(control.leader_username, control.leader_password) + self.url = control.hostURL + 'api/requests/activity/' + control.activity_code_AJG + '/' + response = api.get(self.session, self.url) + if not response.status_code == 200: + pytest.fail('Expected 200 OK, got {0}.'\ + .format(response.status_code)) + try: + assert response.json()[0]['ActivityCode'] == control.activity_code_AJG + except ValueError: + pytest.fail('Expected Json response body, got {0}.'\ + .format(response.text)) + if not (type(response.json()) is list): + pytest.fail('Expected list in response body, got {0}.'\ + .format(response.json())) + if control.activity_code_AJG != response.json()[0]["ActivityCode"]: + warnings.warn("Security fault, wrong activity") + + +# Verify that an activity leader cannot get the membership requests of +# someone else. +# Endpoint -- api/requests/student/:id +# Expected Status Code -- 404 Not Found +# Expected Response Body -- Empty + def test_get_membership_requests_for_someone_else___activity_leader(self): + self.session = \ + self.createAuthorizedSession(control.leader_username, control.leader_password) + self.url = control.hostURL + 'api/requests/student/' + str(control.valid_id_number) + response = api.get(self.session, self.url) + if not response.status_code == 404: + pytest.fail('Expected 404 Not Found, got {0}.'\ + .format(response.status_code)) + + +# Verify that we can create a membership request as leader. +# Precondition -- unknown +# Endpoints -- api/requests/ +# Expected Status Cpde -- 201 Created. +# Expected Content -- A Json object with a REQUEST_ID attribute. + @pytest.mark.skipif(not control.unknownPrecondition, reason = "409 Error") + def test_post_valid_membership_request__as_leader(self): + self.session = \ + self.createAuthorizedSession(control.leader_username, control.leader_password) + self.url = control.hostURL + 'api/requests/' + self.data = { + 'ACT_CDE': control.activity_code_AJG, + 'SESS_CDE' : control.session_code, + 'ID_NUM': control.my_id_number, + 'PART_CDE':'MEMBR', + 'DATE_SENT' : '07/06/2016', + 'COMMENT_TXT': control.comments + } + # We will get the actual id when we post. + # Setting it -1 to check later that we got an id from the post. + self.requestID = -1 + + response = api.postAsJson(self.session, self.url, self.data) + if not response.status_code == 201: + pytest.fail('Expected 201 Created, got {0}.'\ + .format(response.status_code)) + try: + response.json() + except ValueError: + pytest.fail('Expected json response, got {0}.'\ + .format(response.text)) + + #checking if the correctness of post\ + self.session = \ + self.createAuthorizedSession(control.leader_username, control.leader_password) + getResponse = api.get(self.session, control.hostURL + \ + 'api/requests/activity/' + str(control.activity_code_AJG)) + self.requestID = response.json()['REQUEST_ID'] + req = getResponse.json() + found = False + for dic in req: + reqID = dic['RequestID'] + if (reqID == self.requestID): + found = True + try: + assert dic['ActivityCode'] == control.activity_code_AJG + assert dic['SessionCode'] == control.session_code + assert dic['IDNumber'] == control.my_id_number + except ValueError: + pytest.fail('Expected Json response body, got{0}.'\ + .format(getResponse.json())) + if not found: + pytest.fail('requestID not found:', self.requestID) + + #try: + # self.requestID = response.json()['REQUEST_ID'] + # if not response.json()['STATUS'] == REQUEST_STATUS_PENDING: + # pytest.fail('Expected Pending status , got {0}.'.format(resposne.json())) + # except KeyError: + # pytest.fail('Expected REQUEST_ID in response body, got {0}.'.format(response.json())) + # We try to delete the request we created + if self.requestID >= 0: + api.delete(self.session, self.url + str(self.requestID)) + +# Verify that we can create a membership request for someone else as leader. +# Precondition -- unknown +# Endpoints -- api/requests/ +# Expected Status Code -- 401 Unauthorized. +# Expected Response Content -- Empty Response. + @pytest.mark.skipif(not control.unknownPrecondition, reason = "get request") + def test_post_membership_request_for_someone_else(self): + self.session = \ + self.createAuthorizedSession(control.leader_username, control.leader_password) + self.url = control.hostURL + 'api/requests/' + self.data = { + 'ACT_CDE': control.activity_code_AJG, + 'SESS_CDE' : control.session_code, + 'ID_NUM': control.valid_id_number, + 'PART_CDE':'MEMBR', + 'DATE_SENT' : '07/06/2016', + 'COMMENT_TXT': control.comments + } + # We will get the actual id when we post. + self.requestID = -1 + response = api.post(self.session, self.url, self.data) + if response.status_code == 201: + try: + self.requestID = response.json()['REQUEST_ID'] + except (ValueError, KeyError): + pytest.fail('Error in test') + + #checking if the correctness of post\ + self.session = \ + self.createAuthorizedSession(control.leader_username, control.leader_password) + getResponse = api.get(self.session, control.hostURL + \ + 'api/requests/activity/' + str(control.activity_code_AJG)) + self.requestID = response.json()['REQUEST_ID'] + req = getResponse.json() + found = False + for dic in req: + reqID = dic['RequestID'] + if (reqID == self.requestID): + found = True + try: + assert dic['ActivityCode'] == control.activity_code_AJG + assert dic['SessionCode'] == control.session_code + assert dic['IDNumber'] == control.valid_id_number + except ValueError: + pytest.fail('Expected Json response body, got{0}.'\ + .format(getResponse.json())) + if not found: + pytest.fail('requestID not found:', self.requestID) + + + #delete the test post + d = api.delete(self.session, self.url + str(self.requestID)) + if d.status_code != 200: + pytest.fail('Unauthorized resource not deleted.') + + +# Verify that an activity leader can't edit a membership request through a +# put request. +# Pre-Conditions: +# Valid Authorization Header. +# Authenticated as activity leader. +# Expectations: +# Endpoint -- api/requests/:id +# Expected Status Code -- 401 Unauthorized +# Expected Response Body -- Empty +# +# def test_put_membership_request___activity_leader(self): +# self.session = \ +# self.createAuthorizedSession(control.leader_username, control.leader_password) +# self.url = control.hostURL + '/api/requests/' +# self.requestID = -1 +# +# self.predata = { +# 'ACT_CDE': control.activity_code_AJG, +# 'SESS_CDE' : control.session_code, +# 'ID_NUM': control.my_id_number, +# 'PART_CDE':'MEMBR', +# 'DATE_SENT' : '07/06/2016', +# 'COMMENT_TXT': control.comments +# } +# response = api.postAsJson(self.session, self.url, self.predata) +# try: +# self.requestID = response.json()['REQUEST_ID'] +# self.data = { +# 'REQUEST_ID': self.requestID, +# 'ACT_CDE': control.activity_code_AJG, +# 'SESS_CDE' : '201501', +# 'ID_NUM': control.valid_id_number, #Changing values to emulate attacker muhahah +# 'PART_CDE':'PART', +# 'DATE_SENT' : '07/06/2016', +# 'COMMENT_TXT': control.comments +# } +# except ValueError: +# pytest.fail('Error performing setup') +# +# response = api.putAsJson(self.session, self.url + \ +# str(self.requestID), self.data) +# if not response.status_code == 401: +# pytest.fail('Expected 401 Unauthorized, got {0}.'\ +# .format(response.status_code)) +# if response.text: +# pytest.fail('Expected empty response body, got {0}.' +# .format(response.text)) +# api.delete(self.session, self.url + str(self.requestID)) + + +# Verify that an activity leader can delete a membership request for his +# activity +# Endpoints -- api/requests/:id +# Expected Status Code -- 200 OK +# Expected Response Body -- The request that was deleted + def test_delete_membership_request(self): + self.session = \ + self.createAuthorizedSession(control.leader_username, control.leader_password) + self.url = control.hostURL + 'api/requests/' + self.predata = {} + self.requestID = -1 + + self.predata = { + 'ACT_CDE': control.activity_code_AJG, + 'SESS_CDE': control.session_code, + 'PART_CDE': 'MEMBR', + 'ID_NUM': control.leader_id_number, + 'DATE_SENT': '07/19/2016', + 'COMMENT_TXT': control.comments + } + response = api.postAsJson(self.session, self.url, self.predata) + if not response.status_code == 201: + pytest.fail('Error in setup. Expected 201 Created, got {0}.'\ + .format(response.status_code)) + else: + self.requestID = response.json()['REQUEST_ID'] + response = \ + api.delete(self.session, self.url + '/' + str(self.requestID)) + if not response.status_code == 200: + pytest.fail('Expected 200 OK, got {0}.'\ + .format(response.status_code)) + try: + response.json() + except ValueError: + pytest.fail('Expected Json response body, got {0}.'\ + .format(response.text)) + try: + response.json()['REQUEST_ID'] + except KeyError: + pytest.fail('Expected REQUEST_ID in response body, got {0}.'\ + .format(response.json())) + +# Verify that the activity leader can accept a request directed at their +# activity. +# Endpoints -- api/requests/:id/approve +# Expected Status Code -- 200 OK +# Expected Response Body -- Json response with the request that was accepted. + def Test_Allow_someone_to_join_my_activity___activity_leader(self): + self.session = \ + self.createAuthorizedSession(control.leader_username, control.leader_password) + self.url = control.hostURL + 'api/requests/' + self.requestID = -1 + self.membershipID = -1 + + #Create a memberships request for the trash club. + self.data = { + 'ACT_CDE': control.activity_code_AJG, + 'SESS_CDE' : control.session_code, + 'ID_NUM': control.my_id_number, + 'PART_CDE':'MEMBR', + 'DATE_SENT' : '07/06/2016', + 'COMMENT_TXT': control.comments + } + response = api.postAsJson(self.session, self.url, self.data) + if not response.status_code == 201: + pytest.fail('Error in setup. Expected 201 Created, got {0}.'\ + .format(response.status_code)) + try: + response.json() + except ValueError: + pytest.fail('Error in setup. Expected json response, got {0}.'\ + .format(response.text)) + try: + self.requestID = response.json()['REQUEST_ID'] + except KeyError: + pytest.fail('Error in setup. Expected REQUEST_ID in response, ' + \ + 'got {0}.'.format(response.json())) + + response = api.postAsJson(self.session, self.url + \ + str(self.requestID) + '/approve', None) + if not response.status_code == 200: + pytest.fail('Expected 200 OK, got {0}.'\ + .format(response.status_code)) + try: + response.json() + except ValueError: + pytest.fail('Expected Json response body, got {0}.'\ + .format(response.text)) + try: + self.membershipID = response.json()['MEMBERSHIP_ID'] + if self.requestID < 0: + pytest.fail('Error in cleanup for {0}. Expected valid ' + \ + 'request ID, got {1}.'.format(self.requestID)) + else: + d = api.delete(self.session, self.url + str(self.requestID)) + if not d.status_code == 200: + pytest.fail('Error in cleanup for {0}. Expected 200 OK ' + \ + 'when deleting request, got {1}.'\ + .format(d.status_code)) + if self.membershipID < 0: # membership creation was not successful + pytest.fail('Error in cleanup. Expected valid membership ID' + \ + ', got {0}.'.format(self.membershipID)) + else: + api.delete(self.session, control.hostURL + 'api/memberships/' + \ + str(self.membershipID)) + if not d.status_code == 200: + pytest.fail('Error in cleanup. Expected 200 OK when ' + \ + 'deleting membership, got {0}.'.format(d.status_code)) + except KeyError: + pytest.fail('Expected MEMBERSHIP_ID in response bady, got {0}.'\ + .format(response.json())) + +# Verify that the activity leader can deny a request directed at their +# activity. +# Precondition -- unknown +# Endpoints -- api/requests/:id/deny +# Expected Status Code -- 200 OK +# Expected Response Body -- Json response with the request that was denied + @pytest.mark.skipif(not control.unknownPrecondition, reason = "409 Error") + def test_deny_someone_joining_my_activity(self): + self.session = \ + self.createAuthorizedSession(control.leader_username, control.leader_password) + self.url = control.hostURL + 'api/requests/' + self.requestID = -1 + + #Create a memberships request for the trash club. + self.data = { + 'ACT_CDE': control.activity_code_AJG, + 'SESS_CDE' : control.session_code, + 'ID_NUM': control.my_id_number, + 'PART_CDE':'MEMBR', + 'DATE_SENT' : '07/06/2016', + 'COMMENT_TXT': control.comments + } + response = api.postAsJson(self.session, self.url, self.data) + if not response.status_code == 201: + pytest.fail('Expected 201 Created, got {0}.'\ + .format(response.status_code)) + try: + response.json() + except ValueError: + pytest.fail('Expected json response, got {0}.'\ + .format(response.text)) + else: + try: + self.requestID = response.json()['REQUEST_ID'] + except KeyError: + pytest.fail('Error in setup. Expected REQUEST_ID in response' + \ + ', got {0}.'.format(response.json())) + response = api.postAsJson(self.session, self.url + \ + str(self.requestID) + '/deny', None) + if not response.status_code == 200: + pytest.fail('Expected 200 OK, got {0}.'\ + .format(response.status_code)) + try: + response.json() + except ValueError: + pytest.fail('Expected Json response body, got {0}.'\ + .format(response.text)) + else: + try: + if not response.json()['STATUS'] == control.REQUEST_STATUS_DENIED: + pytest.fail('Expected approved request, got {0}.'\ + .format(response.json())) + except KeyError: + pytest.fail('Expected STATUS in response bady, got {0}.'\ + .format(response.json())) + api.delete(self.session, self.url + str(self.requestID)) \ No newline at end of file diff --git a/Tests/ApiEndpoints/test_allmyschedule_pytest.py b/Tests/ApiEndpoints/test_allmyschedule_pytest.py new file mode 100644 index 000000000..c8121a282 --- /dev/null +++ b/Tests/ApiEndpoints/test_allmyschedule_pytest.py @@ -0,0 +1,162 @@ +import pytest +import warnings +import string +from pytest_components import requests +from datetime import datetime + +import pytest_components as api +import test_gordon360_pytest as control + +class Test_AllMyScheduleTest(control.testCase): +# # # # # # # # # # # +# MYSCHEDULE TESTS # +# # # # # # # # # # # + +# Get all custom events from the schedule of the currently logged in user. +# Endpoint -- api/myschedule/ +# Expected Status code -- 200 Ok +# Expected Content -- all custom events of the currently logged in user. + def test_get_all_myschedule_objects_of_current_user(self): + self.session = self.createAuthorizedSession(control.username, control.password) + self.url = control.hostURL + 'api/myschedule/' + response = api.get(self.session, self.url) + + if not response.status_code == 200: + pytest.fail('Expected 200 OK, got {0}.'\ + .format(response.status_code)) + try: + response.json() + except ValueError: + pytest.fail('Expected Json, got {0}.'.format(response.text)) + assert response.json()[0]["EVENT_ID"] == control.event_id + assert response.json()[0]["LOCATION"] == control.location + assert response.json()[0]["DESCRIPTION"] == control.put_description + assert response.json()[0]["BEGIN_TIME"] == control.begintime + assert response.json()[0]["END_TIME"] == control.endtime + +# Get all custom events of a user with username `username` as a parameter. +# Endpoint -- api/myschedule/{username} +# Expected Status code -- 200 Ok +# Expected Content -- all custom events of a user with username `username` +# as a parameter + def test_get_all_myschedule_objects_of_user(self): + self.session = self.createAuthorizedSession(control.username, control.password) + self.url = control.hostURL + 'api/myschedule/' + control.leader_username + '/' + response = api.get(self.session, self.url) + + if not response.status_code == 200: + pytest.fail('Expected 200 OK, got {0}.'\ + .format(response.status_code)) + try: + response.json() + except ValueError: + pytest.fail('Expected Json, got {0}.'.format(response.text)) + assert response.json()[0]["EVENT_ID"] == '1100' + assert response.json()[0]["GORDON_ID"] == str(control.leader_id_number) + assert response.json()[0]["LOCATION"] == control.location + +# Get a specific custom event of the currently logged in user with `eventId` +# as a parameter +# Endpoint -- api/myschedule/event/{eventID} +# Expected Status code -- 200 Ok +# Expected Content -- a specific custom event of the currently logged in user +# with `eventId` as a parameter + def test_get_myschedule_objects_of_id(self): + self.session = self.createAuthorizedSession(control.username, control.password) + self.url = control.hostURL + 'api/myschedule/event/' + control.event_id + '/' + response = api.get(self.session, self.url) + + if not response.status_code == 200: + pytest.fail('Expected 200 OK, got {0}.'\ + .format(response.status_code)) + try: + response.json() + except ValueError: + pytest.fail('Expected Json, got {0}.'.format(response.text)) + assert response.json()["EVENT_ID"] == control.event_id + assert response.json()["LOCATION"] == control.location + assert response.json()["DESCRIPTION"] == control.put_description + assert response.json()["BEGIN_TIME"] == control.begintime + assert response.json()["END_TIME"] == control.endtime + +# Create a custom event of the currently logged in user. +# Expectations: +# Endpoints -- api/myschedule/ +# Expected Status Code -- 201 Created. +# Expected Content -- a custom event with the data in the test + def test_myschedule_post(self): + self.session = self.createAuthorizedSession(control.username, control.password) + self.url = control.hostURL + 'api/myschedule/' + self.data = { + 'GORDON_ID' : str(control.my_id_number), + 'LOCATION' : control.location, + 'DESCRIPTION' : control.description, + 'TUE_CDE' : 'T', + 'IS_ALLDAY' : 1, + } + response = api.postAsJson(self.session, self.url, self.data) + if not response.status_code == 201: + pytest.fail('Expected 201 Created, got {0}.'\ + .format(response.status_code)) + try: + response.json() + except ValueError: + pytest.fail('Expected Json response body, got {0}.'\ + .format(response.text)) + assert response.json()["GORDON_ID"] == str(control.my_id_number) + assert response.json()["LOCATION"] == control.location + assert response.json()["DESCRIPTION"] == control.description + + # delete the test post + # Expected Status Code -- 200 OK. + try: + self.GordonID = response.json()["GORDON_ID"] + if self.GordonID == str(control.my_id_number): + response = api.delete(self.session, self.url + \ + str(response.json()["EVENT_ID"])) + except KeyError: + pytest.fail('Expected REQUEST_ID in response body, got {0}.'\ + .format(response.json())) + if not response.status_code == 200: + pytest.fail('Expected 200 OK, got {0}.'\ + .format(response.status_code)) + +# Update a custom event of the currently logged in user. +# Endpoints -- api/myschedule/ +# Expected Status Code -- 200 OK. +# Expected Content -- The Json object (custom event) with a +# GORDON_ID attribute. + def test_myschedule_put(self): + self.session = self.createAuthorizedSession(control.username, control.password) + self.url = control.hostURL + 'api/myschedule/' + try: + self.data = { + 'EVENT_ID' : control.event_id, + 'GORDON_ID' : str(control.my_id_number), + 'LOCATION' : control.location, + 'DESCRIPTION' : control.put_description, + 'MON_CDE' : 'M', + 'TUE_CDE' : 'T', + 'WED_CDE' : None, # Showing the options of the value + 'THU_CDE' : 'R', + 'FRI_CDE' : 'F', + 'IS_ALLDAY' : 0, + 'BEGIN_TIME' : control.begintime, + 'END_TIME' : control.endtime, + } + except (KeyError, ValueError): + pytest.fail('Error in setup.') + response = api.putAsJson(self.session, self.url, self.data) + if not response.status_code == 200: + pytest.fail('Expected 200 OK, got {0}.'\ + .format(response.status_code)) + try: + response.json() + except ValueError: + pytest.fail('Expected Json response body, got {0}.'\ + .format(response.text)) + assert response.json()["GORDON_ID"] == str(control.my_id_number) + assert response.json()["LOCATION"] == control.location + assert response.json()["DESCRIPTION"] == control.put_description + assert response.json()["BEGIN_TIME"] == control.begintime + assert response.json()["END_TIME"] == control.endtime \ No newline at end of file diff --git a/Tests/ApiEndpoints/test_allnews_pytest.py b/Tests/ApiEndpoints/test_allnews_pytest.py new file mode 100644 index 000000000..9e77214dc --- /dev/null +++ b/Tests/ApiEndpoints/test_allnews_pytest.py @@ -0,0 +1,175 @@ +import pytest +import warnings +import string +from pytest_components import requests +from datetime import datetime + +import pytest_components as api +import test_gordon360_pytest as control + +class Test_AllNewsTest(control.testCase): +# # # # # # # +# NEWS TEST # +# # # # # # # + +# Verify that a student can get the full list of category names, category ids +# , and sort order of student news. +# Endpoint -- api/news/category +# Expected Status Code -- 200 OK +# Expected Response Body -- A list of category names, ids and sort order + def test_get_news_category_student(self): + self.session = self.createAuthorizedSession(control.username, control.password) + self.url = control.hostURL + 'api/news/category/' + response = api.get(self.session, self.url) + + if not response.status_code == 200: + pytest.fail('Expected 200 OK, got {0}.'\ + .format(response.status_code)) + +# Verify that a student can get the list of news that hasn't expired +# Endpoint -- api/news/not-expired +# Expected Status Code -- 200 OK +# Expected Response Body -- A list of student news entries that have not +# expired + def test_get_news_not_expired_student(self): + self.session = self.createAuthorizedSession(control.username, control.password) + self.url = control.hostURL + 'api/news/not-expired/' + response = api.get(self.session, self.url) + + if not response.status_code == 200: + pytest.fail('Expected 200 OK, got {0}.'\ + .format(response.status_code)) + if not (type(response.json()) is list): + warnings.warn("Response is not a list.") + if response.json(): + assert response.json()[0].has_key('categoryName') + assert response.json()[0].has_key('ManualExpirationDate') + assert response.json()[0].has_key('SortOrder') + +# Verify that a student can get student news entries that have been accepted +# and not expired, and is new since 10am the day before. +# Endpoint -- api/news/new +# Expected Status Code -- 200 OK +# Expected Response Body -- A list of student news entries that have been +# accepted, are not expired, and are new since 10 am the day before. + def test_get_news_new_student(self): + self.session = self.createAuthorizedSession(control.username, control.password) + self.url = control.hostURL + 'api/news/new/' + response = api.get(self.session, self.url) + + if not response.status_code == 200: + pytest.fail('Expected 200 OK, got {0}.'\ + .format(response.status_code)) + if not (type(response.json()) is list): + warnings.warn("Response is not a list.") + if not response.json(): + print("Find out the content to add") + +# Verify that a faculty user can get the full list of category names, category ids +# , and sort order of student news. +# Endpoint -- api/news/category +# Expected Status Code -- 200 OK +# Expected Response Body -- A list of category names, ids and sort order + def test_get_news_category_faculty(self): + self.session = self.createAuthorizedSession(control.leader_username, control.leader_password) + self.url = control.hostURL + 'api/news/category/' + response = api.get(self.session, self.url) + + if not response.status_code == 200: + pytest.fail('Expected 200 OK, got {0}.'\ + .format(response.status_code)) + +# Verify that a faculty user can get the list of news that hasn't expired +# Endpoint -- api/news/not-expired +# Expected Status Code -- 200 OK +# Expected Response Body -- A list of student news entries that have not +# expired + def test_get_news_not_expired_faculty(self): + self.session = self.createAuthorizedSession(control.leader_username, control.leader_password) + self.url = control.hostURL + 'api/news/not-expired/' + response = api.get(self.session, self.url) + + if not response.status_code == 200: + pytest.fail('Expected 200 OK, got {0}.'\ + .format(response.status_code)) + if not (type(response.json()) is list): + warnings.warn("Response is not a list.") + if response.json(): + assert response.json()[0].has_key('categoryName') + assert response.json()[0].has_key('ManualExpirationDate') + assert response.json()[0].has_key('SortOrder') + +# Verify that a faculty user can get student news entries that have been accepted +# and not expired, and is new since 10am the day before. +# Endpoint -- api/news/new +# Expected Status Code -- 200 OK +# Expected Response Body -- A list of student news entries that have been +# accepted, are not expired, and are new since 10 am the day before. + def test_get_news_new_faculty(self): + self.session = self.createAuthorizedSession(control.leader_username, control.leader_password) + self.url = control.hostURL + 'api/news/new/' + response = api.get(self.session, self.url) + + if not response.status_code == 200: + pytest.fail('Expected 200 OK, got {0}.'\ + .format(response.status_code)) + if not (type(response.json()) is list): + warnings.warn("Response is not a list.") + if not response.json(): + print("Find out the content to add") + +# Verify that a guest can't get the full list of category names, category ids +# , and sort order of student news. +# Endpoint -- api/news/category +# Expected Status Code -- 401 Unauthorized Error +# Expected Response Body -- An authorization denied error + def test_get_news_category_guest(self): + self.session = self.createGuestSession() + self.url = control.hostURL + 'api/news/category/' + response = api.get(self.session, self.url) + + if not response.status_code == 401: + pytest.fail('Expected 401 Unauthorized Error, got {0}.'\ + .format(response.status_code)) + try: + assert response.json()['Message'] == control.AUTHORIZATION_DENIED + except ValueError: + pytest.fail('Expected Json response body, got{0}.'\ + .format(response.text)) + +# Verify that a guest can't get the list of news that hasn't expired +# Endpoint -- api/news/not-expired +# Expected Status Code -- 401 Unauthorized Error +# Expected Response Body -- An authorization denied error + def test_get_news_not_expired_guest(self): + self.session = self.createGuestSession() + self.url = control.hostURL + 'api/news/not-expired/' + response = api.get(self.session, self.url) + + if not response.status_code == 401: + pytest.fail('Expected 401 Unauthorized Error, got {0}.'\ + .format(response.status_code)) + try: + assert response.json()['Message'] == control.AUTHORIZATION_DENIED + except ValueError: + pytest.fail('Expected Json response body, got{0}.'\ + .format(response.text)) + +# Verify that a guest can't get student news entries that have been accepted +# and not expired, and is new since 10am the day before. +# Endpoint -- api/news/new +# Expected Status Code -- 401 Unauthorized Error +# Expected Response Body -- An authorization denied error + def test_get_news_new_guest(self): + self.session = self.createGuestSession() + self.url = control.hostURL + 'api/news/new/' + response = api.get(self.session, self.url) + + if not response.status_code == 401: + pytest.fail('Expected 401 Unauthorized Error, got {0}.'\ + .format(response.status_code)) + try: + assert response.json()['Message'] == control.AUTHORIZATION_DENIED + except ValueError: + pytest.fail('Expected Json response body, got{0}.'\ + .format(response.text)) diff --git a/Tests/ApiEndpoints/test_allprofile_pytest.py b/Tests/ApiEndpoints/test_allprofile_pytest.py new file mode 100644 index 000000000..e43aeb16f --- /dev/null +++ b/Tests/ApiEndpoints/test_allprofile_pytest.py @@ -0,0 +1,383 @@ +import pytest +import warnings +import string +from pytest_components import requests +from datetime import datetime + +import pytest_components as api +import test_gordon360_pytest as control + +class Test_AllProfileTest(control.testCase): +################# +# PROFILE TESTS # +################# + +# Verify that a user can get their own profile +# Endpoint -- api/profiles/ +# Expected Status Code -- 200 OK +# Expected Response Body -- A json object of information on own profile + def test_get_my_profile(self): + self.session = self.createAuthorizedSession(control.username, control.password) + self.url = control.hostURL + 'api/profiles/' + response = api.get(self.session, self.url) + if not response.status_code == 200: + pytest.fail('Expected 200 OK, got {0}.'\ + .format(response.status_code)) + try: + assert response.json()['AD_Username'] == '360.StudentTest' + assert response.json()['ID'] == '999999097' + except ValueError: + pytest.fail('Expected Json response body, got {0}.'\ + .format(response.text)) + +# Verify that a user can get their own profile +# Endpoint -- api/profiles/ +# Expected Status Code -- 401 Authorization Error +# Expected Response Body -- An authorization denied message + def test_get_guest_my_profile(self): + self.session = self.createGuestSession() + self.url = control.hostURL + 'api/profiles/' + response = api.get(self.session, self.url) + if not response.status_code == 401: + pytest.fail('Expected 401 OK, got {0}.'\ + .format(response.status_code)) + try: + assert response.json()['Message'] == control.AUTHORIZATION_DENIED + except ValueError: + pytest.fail('Expected Json response body, got {0}.'\ + .format(response.text)) + +# Verify that a user can get another person's profile, filtering +# private information +# Endpoint -- api/profiles/:username +# Expected Status Code -- 200 Ok +# Expected Response Body -- list of information on the user without private +# info + def test_get_profile_by_username(self): + self.session = self.createAuthorizedSession(control.username, control.password) + self.url = control.hostURL + 'api/profiles/' + control.leader_username +'/' + response = api.get(self.session, self.url) + if not response.status_code == 200: + pytest.fail('Expected 200 OK, got {0}.'\ + .format(response.status_code)) + try: + assert response.json()['AD_Username'] == '360.FacultyTest' + assert "ID" not in response.json() + except ValueError: + pytest.fail('Expected Json response body, got{0}.'\ + .format(response.text)) + +# Verify that a guest can't get another person's profile +# Endpoint -- api/profiles/:username +# Expected Status Code -- 401 Unauthorized Error +# Expected Response Body -- An authorization denied message + def test_get_guest_profile_by_username(self): + self.session = self.createGuestSession() + self.url = control.hostURL + 'api/profiles/' + control.leader_username +'/' + response = api.get(self.session, self.url) + print(response.json()) + if not response.status_code == 401: + pytest.fail('Expected 401 OK, got {0}.'\ + .format(response.status_code)) + try: + assert response.json()['Message'] == control.AUTHORIZATION_DENIED + except ValueError: + pytest.fail('Expected Json response body, got{0}.'\ + .format(response.text)) + +# Verify that a user can get a profile image of the current user +# Endpoint -- api/profiles/image +# Expected Status Code -- 200 Ok +# Expected Response Body -- image path of the current user + def test_get_image(self): + self.session = self.createAuthorizedSession(control.username, control.password) + self.url = control.hostURL + 'api/profiles/image/' + response = api.get(self.session, self.url) + if not response.status_code == 200: + pytest.fail('Expected 200 OK, got {0}.'\ + .format(response.status_code)) + try: + response.json() + except ValueError: + pytest.fail('Expected Json response body, got{0}.'\ + .format(response.text)) + +# Verify that a guest can't get a profile image of the current user +# Endpoint -- api/profiles/image +# Expected Status Code -- 401 Unauthorized Error +# Expected Response Body -- An authorization denied message + def test_get_guest_image(self): + self.session = self.createGuestSession() + self.url = control.hostURL + 'api/profiles/image/' + response = api.get(self.session, self.url) + if not response.status_code == 401: + pytest.fail('Expected 401 Unauthorized Error, got {0}.'\ + .format(response.status_code)) + try: + assert response.json()['Message'] == control.AUTHORIZATION_DENIED + except ValueError: + pytest.fail('Expected Json response body, got{0}.'\ + .format(response.text)) + + +# Verify that a user can get a profile image of someone else +# Endpoint -- api/profiles/image/:username +# Expected Status Code -- 200 Ok +# Expected Response Body -- image path of another user + def test_get_image_by_username(self): + self.session = self.createAuthorizedSession(control.username, control.password) + self.url = control.hostURL + 'api/profiles/image/' + control.leader_username + '/' + response = api.get(self.session, self.url) + if not response.status_code == 200: + pytest.fail('Expected 200 OK, got {0}.'\ + .format(response.status_code)) + try: + response.json() + except ValueError: + pytest.fail('Expected Json response body, got{0}.'\ + .format(response.text)) + +# Verify that a guest can't get a profile image of someone else +# Endpoint -- api/profiles/image/:username +# Expected Status Code -- 401 Unauthorized Error +# Expected Response Body -- An authorization denied message + def test_get_guest_image_by_username(self): + self.session = self.createGuestSession() + self.url = control.hostURL + 'api/profiles/image/' + control.username + '/' + response = api.get(self.session, self.url) + if not response.status_code == 401: + pytest.fail('Expected 401 Unauthorized Error, got {0}.'\ + .format(response.status_code)) + try: + assert response.json()['Message'] == control.AUTHORIZATION_DENIED + except ValueError: + pytest.fail('Expected Json response body, got{0}.'\ + .format(response.text)) + +# Verify that a user can upload a profile image +# Endpoint -- api/profiles/image/ +# Expected Status Code -- 200 OK +# Expected Content -- updated profile image + def test_post_profile_image(self): + self.session = self.createAuthorizedSession(control.username, control.password) + self.url = control.hostURL + 'api/profiles/image/' + self.data = { + 'file': open(control.FILE_PATH_PROFILE, 'r') + } + + response = api.postAsFormData(self.session, self.url, self.data) + if not response.status_code == 200: + pytest.fail('Expected 200 OK, got {0}.'\ + .format(response.status_code)) + #self.data = { + # 'ID': my_id_number, + # 'FILE_PATH': FILE_PATH, + # 'FILE_NAME': FILE_NAME + #} + d = api.post(self.session, self.url + 'reset/', self.data) + if not d.status_code == 200: + pytest.fail('There was a problem performing cleanup') + +# Verify that a guest cannot upload a profile image +# Endpoint -- api/profiles/image/ +# Expected Status Code -- 401 Unauthorized Error +# Expected Content -- An authorization denied message + def test_post_guest_profile_image(self): + self.session = self.createGuestSession() + self.url = control.hostURL + 'api/profiles/image/' + self.data = { + 'file': open(control.FILE_PATH_PROFILE, 'r') + } + + response = api.postAsFormData(self.session, self.url, self.data) + print(response.json()) + if not response.status_code == 401: + pytest.fail('Expected 401 Unauthorized Error, got {0}.'\ + .format(response.status_code)) + try: + assert response.json()['Message'] == control.AUTHORIZATION_DENIED + except ValueError: + pytest.fail('Expected Json response body, got{0}.'\ + .format(response.text)) + +# Verify that a user can upload an ID image +# Pre-conditions -- unknown +# Endpoint -- api/profiles/IDimage/ +# Expected Status Code -- 200 OK +# Expected Content -- upload ID photo + @pytest.mark.skipif(not control.unknownPrecondition, reason = \ + "Unknown reason for error") + def test_post_ID_image(self): + self.session = self.createAuthorizedSession(control.username, control.password) + self.url = control.hostURL + 'api/profiles/IDimage/' + self.data = { + 'file': open(control.FILE_PATH_ID, 'r') + } + + response = api.postAsFormData(self.session, self.url, self.data) + if not response.status_code == 200: + pytest.fail('Expected 200 OK, got {0}.'\ + .format(response.status_code)) + + d = api.post(self.session, self.url + 'reset/', self.data) + if not d.status_code == 200: + pytest.fail('There was a problem performing cleanup') + +# Verify that a guest can't upload an ID image +# Endpoint -- api/profiles/IDimage/ +# Expected Status Code -- 401 Unauthorized Error +# Expected Content -- An authorization denied message + def test_post_guest_ID_image(self): + self.session = self.createGuestSession() + self.url = control.hostURL + 'api/profiles/IDimage/' + self.data = { + 'file': open(control.FILE_PATH_ID, 'r') + } + response = api.postAsFormData(self.session, self.url, self.data) + if not response.status_code == 401: + pytest.fail('Expected 401 OK, got {0}.'\ + .format(response.status_code)) + try: + assert response.json()['Message'] == control.AUTHORIZATION_DENIED + except ValueError: + pytest.fail('Expected Json response body, got{0}.'\ + .format(response.text)) + +# Verify that a user can reset a profile image +# Endpoint -- api/profiles/image/reset/ +# Expected Status Code -- 200 OK +# Expected Content -- + def test_post_reset_image(self): + self.session = self.createAuthorizedSession(control.username, control.password) + self.url = control.hostURL + 'api/profiles/image/reset/' + self.data = { + 'ID': control.my_id_number, + 'FILE_PATH': control.FILE_PATH_PROFILE, + 'FILE_NAME': "" + } + self.requestID = -1 + response = api.post(self.session, self.url, self.data) + if not response.status_code == 200: + pytest.fail('Expected 200 Created, got {0}.'\ + .format(response.status_code)) + +# Verify that a guest can't reset a profile image +# Endpoint -- api/profiles/image/reset/ +# Expected Status Code -- 401 Unauthorized Error +# Expected Content -- An authorization denied message + def test_post_guest_reset_image(self): + self.session = self.createGuestSession() + self.url = control.hostURL + 'api/profiles/image/reset/' + self.data = { + 'ID': control.my_id_number, + 'FILE_PATH': control.FILE_PATH_PROFILE, + 'FILE_NAME': "" + } + self.requestID = -1 + response = api.post(self.session, self.url, self.data) + if not response.status_code == 401: + pytest.fail('Expected 401 Created, got {0}.'\ + .format(response.status_code)) + try: + assert response.json()['Message'] == control.AUTHORIZATION_DENIED + except ValueError: + pytest.fail('Expected Json response body, got{0}.'\ + .format(response.text)) + +# Verify that a user can add and edit social media links +# Endpoint -- api/profiles/:type +# Expected Status Code -- 200 OK +# Expected Content -- + def test_put_social_media_links(self): + self.session = self.createAuthorizedSession(control.username, control.password) + self.url = control.hostURL + 'api/profiles/facebook/' + self.data = { + 'facebook': 'https://www.facebook.com/360.studenttest' + #'URL of any SNS including the domain name' + } + response = api.put(self.session, self.url, self.data) + if not response.status_code == 200: + pytest.fail('Expected 200 OK, got {0}.'\ + .format(response.status_code)) + self.resetdata = { + 'facebook': 'Changed for testing' + } + d = api.put(self.session, self.url, self.resetdata) + if not d.status_code == 200: + pytest.fail('There was a problem performing cleanup') + +# Verify that a guest can't add and edit social media links +# Endpoint -- api/profiles/:type +# Expected Status Code -- 401 Unauthorized Error +# Expected Content -- An authorization denied message + def test_put_guest_social_media_links(self): + self.session = self.createGuestSession() + self.url = control.hostURL + 'api/profiles/facebook/' + self.data = { + 'facebook': 'https://www.facebook.com/360.studenttest' + } + response = api.put(self.session, self.url, self.data) + if not response.status_code == 401: + pytest.fail('Expected 401 OK, got {0}.'\ + .format(response.status_code)) + try: + assert response.json()['Message'] == control.AUTHORIZATION_DENIED + except ValueError: + pytest.fail('Expected Json response body, got{0}.'\ + .format(response.text)) + + +# Verify that a user can turn on and off mobile privacy +# Endpoint -- api/profiles/mobile_privacy/:value (Y or N) +# Expected Status Code -- 200 OK +# Expected Content -- Make mobile privacy 0 or 1 + def test_put_mobile_privacy(self): + self.session = self.createAuthorizedSession(control.username, control.password) + self.url = control.hostURL + 'api/profiles/mobile_privacy/Y/' + self.data = { + 'IsMobilePhonePrivate': 'Y' + } + response = api.put(self.session, self.url, self.data) + if not response.status_code == 200: + pytest.fail('Expected 200 OK, got {0}.'\ + .format(response.status_code)) + profile_url = control.hostURL + 'api/profiles/' + check_response = api.get(self.session,profile_url) + assert check_response.json()['IsMobilePhonePrivate'] == 1 + self.url = control.hostURL + 'api/profiles/mobile_privacy/N/' + self.resetdata = { + 'IsMobilePhonePrivate': 'N' + } + d = api.put(self.session, self.url, self.resetdata) + if not d.status_code == 200: + pytest.fail('There was a problem performing cleanup') + check_response = api.get(self.session,profile_url) + assert check_response.json()['IsMobilePhonePrivate'] == 0 + +# Verify that a user can edit image privacy +# Endpoint -- api/profiles/image_privacy/:value (Y or N) +# Expected Status Code -- 200 OK +# Expected Content -- + def test_put_image_privacy(self): + self.session = self.createAuthorizedSession(control.username, control.password) + self.url = control.hostURL + 'api/profiles/image_privacy/Y/' + self.data = { + 'show_pic': 'Y' + } + response = api.put(self.session, self.url, self.data) + if not response.status_code == 200: + pytest.fail('Expected 200 OK, got {0}.'\ + .format(response.status_code)) + profile_url = control.hostURL + 'api/profiles/' + check_response = api.get(self.session,profile_url) + assert check_response.json()['show_pic'] == 1 + self.url = control.hostURL + 'api/profiles/image_privacy/N/' + self.resetdata = { + 'show_pic': 'N' + } + d = api.put(self.session, self.url, self.resetdata) + if not d.status_code == 200: + pytest.fail('There was a problem performing cleanup') + + check_response = api.get(self.session,profile_url) + assert check_response.json()['show_pic'] == 0 \ No newline at end of file diff --git a/Tests/ApiEndpoints/test_allschedule_pytest.py b/Tests/ApiEndpoints/test_allschedule_pytest.py new file mode 100644 index 000000000..e39d92579 --- /dev/null +++ b/Tests/ApiEndpoints/test_allschedule_pytest.py @@ -0,0 +1,58 @@ +import pytest +import warnings +import string +from pytest_components import requests +from datetime import datetime + +import pytest_components as api +import test_gordon360_pytest as control + +class Test_AllScheduleTest(control.testCase): +# # # # # # # # # # +# SCHEDULE TESTS # +# # # # # # # # # # + +# Get all schedule objects of the currently logged in user. +# Pre-condition -- student must be enrolled in summer practicum +# Endpoint -- api/schedule/:username +# Expected Status code -- 200 Ok +# Expected Content -- all schedule objects of the currently logged in user. + @pytest.mark.skipif(not control.enrolledInPracticum, reason = \ + "Student not enrolled in Practicum") + def test_get_all_schedule_objects_of_current_user(self): + self.session = self.createAuthorizedSession(control.username, control.password) + self.url = control.hostURL + 'api/schedule/' + control.username + '/' + response = api.get(self.session, self.url) + + if not response.status_code == 200: + pytest.fail('Expected 200 OK, got {0}.'\ + .format(response.status_code)) + try: + response.json() + except ValueError: + pytest.fail('Expected Json, got {0}.'.format(response.text)) + assert response.json()[0]["CRS_TITLE"] == \ + "SUMMER PRACTICUM COMPUTER SCIENCE" + +# Get all schedule objects of a user with username `username` as a parameter. +# Pre-condition -- unknown +# Endpoint -- api/schedule/:username +# Expected Status code -- 200 Ok +# Expected Content -- all schedule objects of a user with username `username` +# as a parameter +# Normal faculty works, student's don't work, facultytest doesn't work + @pytest.mark.skipif(not control.unknownPrecondition, reason = \ + "Unknown reason for error") + def test_get_all_schedule_objects_of_user(self): + self.session = self.createAuthorizedSession(control.username, control.password) + self.url = control.hostURL + 'api/schedule/' + control.leader_username + '/' + response = api.get(self.session, self.url) + + if not response.status_code == 200: + pytest.fail('Expected 200 OK, got {0}.'\ + .format(response.status_code)) + try: + response.json() + except ValueError: + pytest.fail('Expected Json, got {0}.'.format(response.text)) + assert response.json()[0]["GORDON_ID"] == str(control.leader_id_number) \ No newline at end of file diff --git a/Tests/ApiEndpoints/test_allschedulecontrol_pytest.py b/Tests/ApiEndpoints/test_allschedulecontrol_pytest.py new file mode 100644 index 000000000..309b121d1 --- /dev/null +++ b/Tests/ApiEndpoints/test_allschedulecontrol_pytest.py @@ -0,0 +1,107 @@ +import pytest +import warnings +import string +from pytest_components import requests +from datetime import datetime + +import pytest_components as api +import test_gordon360_pytest as control + +class Test_AllScheduleControlTest(control.testCase): +# # # # # # # # # # # # # +# SCHEDULECONTROL TESTS # +# # # # # # # # # # # # # + +# Get the privacy status and description of the currently logged in user. +# Endpoint -- api/schedulecontrol +# Expected Status code -- 200 Ok +# Expected Content -- all schedule objects of the currently logged in user. + def test_get_all_schedulecontrol_objects_of_current_user(self): + self.session = self.createAuthorizedSession(control.username, control.password) + self.url = control.hostURL + 'api/schedulecontrol/' + response = api.get(self.session, self.url) + + if not response.status_code == 200: + pytest.fail('Expected 200 OK, got {0}.'\ + .format(response.status_code)) + try: + response.json() + except ValueError: + pytest.fail('Expected Json, got {0}.'\ + .format(response.text)) + assert response.json()['IsSchedulePrivate'] == True + assert response.json()['Description'] == control.put_description + +# Get the privacy, description, and ID of a user's schedule with username +# `leader_username` as a parameter. +# Endpoint -- api/schedulecontrol/{username} +# Expected Status code -- 200 Ok +# Expected Content -- all schedule objects of the currently logged in user. + def test_get_all_schedulecontrol_objects_of_user(self): + self.session = self.createAuthorizedSession(control.username, control.password) + self.url = control.hostURL + 'api/schedulecontrol/' + control.leader_username + '/' + response = api.get(self.session, self.url) + + if not response.status_code == 200: + pytest.fail('Expected 200 OK, got {0}.'\ + .format(response.status_code)) + try: + response.json() + except ValueError: + pytest.fail('Expected Json, got {0}.'.format(response.text)) + assert response.json()['IsSchedulePrivate'] == False + assert response.json()['Description'] == \ + 'httpsCoLnSlShSlShgithubdOTcomSlSh' + +# Update schedule privacy of the currently logged in user to 1. +# Endpoint -- api/schedulecontrol/privacy/{value} +# Expected Status code -- 200 Ok +# Expected Content -- schedule privacy of the currently logged in user. + def test_schedulecontrol_put_privacy(self): + self.session = self.createAuthorizedSession(control.username, control.password) + self.url = control.hostURL + 'api/schedulecontrol/privacy/N/' + response = api.put(self.session, self.url, 'N') + + if not response.status_code == 200: + pytest.fail('Expected 200 OK, got {0}.'\ + .format(response.status_code)) + + self.url = control.hostURL + 'api/schedulecontrol/' + response = api.get(self.session, self.url) + if not response.status_code == 200: + pytest.fail('Expected 200 OK, got {0}.'\ + .format(response.status_code)) + assert response.json()["IsSchedulePrivate"] == False + + self.url = self.url + 'privacy/Y/' + response = api.put(self.session, self.url, 'Y') + + if not response.status_code == 200: + pytest.fail('Expected 200 OK, got {0}.'\ + .format(response.status_code)) + + self.url = control.hostURL + 'api/schedulecontrol/' + response = api.get(self.session, self.url) + if not response.status_code == 200: + pytest.fail('Expected 200 OK, got {0}.'\ + .format(response.status_code)) + assert response.json()["IsSchedulePrivate"] == True + +# Update the schedule description of the currently logged in user. +# Endpoint -- api/schedulecontrol/description/{value} +# Expected Status code -- 200 Ok +# Expected Content -- schedule description of the currently logged in user. + def test_schedulecontrol_put_description(self): + self.session = self.createAuthorizedSession(control.username, control.password) + self.url = control.hostURL + 'api/schedulecontrol/description/' + \ + control.put_description + '/' + response = api.put(self.session, self.url, control.put_description) + if not response.status_code == 200: + pytest.fail('Expected 200 OK, got {0}.'\ + .format(response.status_code)) + self.url = control.hostURL + 'api/schedulecontrol/' + response = api.get(self.session, self.url) + if not response.status_code == 200: + pytest.fail('Expected 200 OK, got {0}.'\ + .format(response.status_code)) + assert response.json()["Description"] == control.put_description \ No newline at end of file diff --git a/Tests/ApiEndpoints/test_allsession_pytest.py b/Tests/ApiEndpoints/test_allsession_pytest.py new file mode 100644 index 000000000..a637e3c71 --- /dev/null +++ b/Tests/ApiEndpoints/test_allsession_pytest.py @@ -0,0 +1,118 @@ +import pytest +import warnings +import string +from pytest_components import requests +from datetime import datetime + +import pytest_components as api +import test_gordon360_pytest as control + +class Test_AllSessionTest(control.testCase): + +# # # # # # # # # +# SESSIONS TEST # +# # # # # # # # # + +# Verify that an activity leader can get all session objects +# Endpoint -- api/sessions/ +# Expected Status Code -- 200 OK +# Expected Response Body -- List of all session resources + def test_get_all_sessions(self): + self.session = self.createAuthorizedSession(control.username, control.password) + self.url = control.hostURL + 'api/sessions/' + response = api.get(self.session, self.url) + if not response.status_code == 200: + pytest.fail('Expected 200 OK, got {0}.'\ + .format(response.status_code)) + try: + response.json() + except ValueError: + pytest.fail('Expected Json response body, got {0}.'\ + .format(response.json())) + if not (type(response.json()) is list): + pytest.fail('Expected list, got {0}.'.format(response.json())) + assert response.json()[0]["SessionCode"] == "201209" + assert response.json()[0]["SessionDescription"] == \ + "Fall 12-13 Academic Year" + assert response.json()[0]["SessionBeginDate"] == "2012-08-29T00:00:00" + assert response.json()[0]["SessionEndDate"] == "2012-12-21T00:00:00" + + self.url = control.hostURL + 'api/sessions/current/' + current = api.get(self.session, self.url) + assert response.json()[-2]["SessionCode"] == \ + current.json()["SessionCode"] + assert response.json()[-2]["SessionDescription"] == \ + current.json()["SessionDescription"] + assert response.json()[-2]["SessionBeginDate"] == \ + current.json()["SessionBeginDate"] + assert response.json()[-2]["SessionEndDate"] == \ + current.json()["SessionEndDate"] + +# Verify that an activity leader can get a session object +# Endpoint -- api/sessions/:id +# Expected Status Code -- 200 OK +# Expected Response Body -- A session resource. + def test_get_one_session(self): + self.session = self.createAuthorizedSession(control.username, control.password) + self.url = control.hostURL + 'api/sessions/' + control.session_code + '/' + + response = api.get(self.session, self.url) + if not response.status_code == 200: + pytest.fail('Expected 200 OK, got {0}.'\ + .format(response.status_code)) + try: + response.json() + except ValueError: + pytest.fail('Expected Json response body, got {0}.'\ + .format(response.text)) + try: + response.json()['SessionCode'] + except KeyError: + pytest.fail('Expected SessionCode in response, got {0}.'\ + .format(response.json())) + assert response.json()['SessionCode'] == control.session_code + +# Verify that a user can get the current session +# Endpoint -- api/sessions/current/ +# Expected Status Code -- 200 OK +# Expected Response Body -- the current session + def test_get_current_session(self): + self.session = self.createAuthorizedSession(control.username, control.password) + self.url = control.hostURL + 'api/sessions/current/' + response = api.get(self.session, self.url) + if not response.status_code == 200: + pytest.fail('Expected 200 OK, got {0}.'\ + .format(response.status_code)) + try: + response.json() + except ValueError: + pytest.fail('Expected Json response body, got {0}.'\ + .format(response.text)) + try: + response.json()['SessionCode'] + except KeyError: + pytest.fail('Expected SessionCode in response, got {0}.'\ + .format(response.json())) + +# Verify that a user can get the days left of the session +# Endpoint -- api/sessions/daysLeft/ +# Expected Status Code -- 200 OK +# Expected Response Body -- numbers of days left + def test_get_daysLeft_session(self): + self.session = self.createAuthorizedSession(control.username, control.password) + self.url = control.hostURL + 'api/sessions/daysLeft/' + + response = api.get(self.session, self.url) + if not response.status_code == 200: + pytest.fail('Expected 200 OK, got {0}.'\ + .format(response.status_code)) + try: + response.json() + except ValueError: + pytest.fail('Expected Json response body, got {0}.'\ + .format(response.text)) + try: + response.json() + except KeyError: + pytest.fail('Expected SessionCode in response, got {0}.'\ + .format(response.json())) \ No newline at end of file diff --git a/Tests/ApiEndpoints/test_allstudentemployment_pytest.py b/Tests/ApiEndpoints/test_allstudentemployment_pytest.py new file mode 100644 index 000000000..9eca73d90 --- /dev/null +++ b/Tests/ApiEndpoints/test_allstudentemployment_pytest.py @@ -0,0 +1,36 @@ +import pytest +import warnings +import string +from pytest_components import requests +from datetime import datetime + +import pytest_components as api +import test_gordon360_pytest as control + +class Test_AllStudentEmploymentTest(control.testCase): + +# # # # # # # # # # # # # # +# STUDENT EMPLOYMENT TEST # +# # # # # # # # # # # # # # + +# Verify that a student user can get their own student employment information +# Pre-Conditions: Need to be logged in as cct.service in visual studio +# Endpoint -- api/studentemployment/ +# Expected Status Code -- 200 OK +# Expected Response Body -- A json response with student employment info + @pytest.mark.skipif(not control.cctService, reason = \ + "Not logged in as cct.service.") + def test_student_employment___regular_member(self): + self.session = self.createAuthorizedSession(control.username, control.password) + self.url = control.hostURL + 'api/studentemployment/' + response = api.get(self.session, self.url) + if not response.status_code == 200: + pytest.fail('Expected 200 OK, got {0}.'\ + .format(response.status_code)) + try: + response.json() + except ValueError: + pytest.fail('Expected Json response body, got {0}.'\ + .format(response.text)) + if not (type(response.json()) is dict): + pytest.fail('Expected dict, got {0}.'.format(response.json())) \ No newline at end of file diff --git a/Tests/ApiEndpoints/test_allvictorypromise_pytest.py b/Tests/ApiEndpoints/test_allvictorypromise_pytest.py new file mode 100644 index 000000000..5c93244eb --- /dev/null +++ b/Tests/ApiEndpoints/test_allvictorypromise_pytest.py @@ -0,0 +1,80 @@ +import pytest +import warnings +import string +from pytest_components import requests +from datetime import datetime + +import pytest_components as api +import test_gordon360_pytest as control + +class Test_AllVictoryPromiseTest(control.testCase): + +# # # # # # # # # # # # # +# VICTORY PROMISE TEST # +# # # # # # # # # # # # # + +# Verify that a student user can get their own victory promise information +# Endpoint -- api/studentemployment/ +# Expected Status Code -- 200 OK +# Expected Response Body -- A json response with victory promise points + def test_victory_promise(self): + self.session = self.createAuthorizedSession(control.username, control.password) + self.url = control.hostURL + 'api/vpscore/' + response = api.get(self.session, self.url) + if not response.status_code == 200: + pytest.fail('Expected 200 OK, got {0}.'\ + .format(response.status_code)) + try: + response.json() + except ValueError: + pytest.fail('Expected Json response body, got {0}.'\ + .format(response.text)) + if not (type(response.json()) is list): + pytest.fail('Expected list, got {0}.'.format(response.json)) + assert response.json()[0]["TOTAL_VP_IM_SCORE"] == 0 + assert response.json()[0]["TOTAL_VP_CC_SCORE"] == 0 + assert response.json()[0]["TOTAL_VP_LS_SCORE"] == 0 + assert response.json()[0]["TOTAL_VP_LW_SCORE"] == 0 + +# Verify that a guest can't get victory promise information +# Endpoint -- api/studentemployment/ +# Expected Status Code -- 401 Unauthorized Error +# Expected Response Body -- An authorization denied message + def test_guest_victory_promise(self): + self.session = self.createGuestSession() + self.url = control.hostURL + 'api/vpscore/' + response = api.get(self.session, self.url) + + if not response.status_code == 401: + pytest.fail('Expected 401 Unauthorized Error, got {0}.'\ + .format(response.status_code)) + try: + assert response.json()['Message'] == control.AUTHORIZATION_DENIED + except ValueError: + pytest.fail('Expected Json response body, got{0}.'\ + .format(response.text)) + +# Verify that a faculty user's victory promise information is always 0. +# Endpoint -- api/studentemployment/ +# Expected Status Code -- 200 OK +# Expected Response Body -- A json response with victory promise points all 0 + def test_faculty_victory_promise(self): + self.session = \ + self.createAuthorizedSession(control.leader_username, control.leader_password) + self.url = control.hostURL + 'api/vpscore/' + response = api.get(self.session, self.url) + + if not response.status_code == 200: + pytest.fail('Expected 200 Unauthorized Error, got {0}.'\ + .format(response.status_code)) + try: + response.json() + except ValueError: + pytest.fail('Expected Json response body, got {0}.'\ + .format(response.text)) + if not (type(response.json()) is list): + pytest.fail('Expected list, got {0}.'.format(response.json)) + assert response.json()[0]["TOTAL_VP_IM_SCORE"] == 0 + assert response.json()[0]["TOTAL_VP_CC_SCORE"] == 0 + assert response.json()[0]["TOTAL_VP_LS_SCORE"] == 0 + assert response.json()[0]["TOTAL_VP_LW_SCORE"] == 0 \ No newline at end of file diff --git a/Tests/ApiEndpoints/test_allwellnesscheck_pytest.py b/Tests/ApiEndpoints/test_allwellnesscheck_pytest.py new file mode 100644 index 000000000..dfcf63f45 --- /dev/null +++ b/Tests/ApiEndpoints/test_allwellnesscheck_pytest.py @@ -0,0 +1,321 @@ +import pytest +import warnings +import string +from pytest_components import requests +from datetime import datetime + +import pytest_components as api +import test_gordon360_pytest as control + +class Test_AllWellnessCheckTest(control.testCase): +# # # # # # # # # # # # +# WELLNESS CHECK TEST # +# # # # # # # # # # # # + +# Verify that a student can get their current status +# Endpoint -- api/wellness/ +# Expected Status Code -- 200 OK +# Expected Response Body -- A list of one dictionary with user answer + def test_get_wellness_asymptomatic_student(self): + self.session = self.createAuthorizedSession(control.username, control.password) + self.url = control.hostURL + 'api/wellness/' + response = api.get(self.session, self.url) + + if not response.status_code == 200: + pytest.fail('Expected 200 OK, got {0}.'\ + .format(response.status_code)) + try: + response.json() + except ValueError: + pytest.fail('Expected Json respone body, got {0}.'\ + .format(response.text)) + if not (type(response.json()) is list): + warnings.warn("Response is not a list.") + assert response.json()[0]["answerValid"] == True + assert response.json()[0]["userAnswer"] == True or \ + response.json()[0]["userAnswer"] == False + +# Verify that a student can get the wellness check question +# Endpoint -- api/wellness/Question +# Expected Status Code -- 200 OK +# Expected Response Body -- A list of a dictionary of questions +# and prompts. + def test_get_wellness_question_student(self): + self.session = self.createAuthorizedSession(control.username, control.password) + self.url = control.hostURL + 'api/wellness/question/' + response = api.get(self.session, self.url) + + if not response.status_code == 200: + pytest.fail('Expected 200 OK, got {0}.'\ + .format(response.status_code)) + if not (type(response.json()) is list): + warnings.warn("Response is not a list.") + assert response.json()[0].has_key('yesPrompt') + assert response.json()[0].has_key('noPrompt') + assert response.json()[0].has_key('question') + +# Verify that a student can answer if they are symptomatic (true) +# Endpoint -- api/wellness/ +# Expected Status Code -- 201 Created +# Expected Response Body -- none + def test_post_wellness_symptomatic_student(self): + self.session = self.createAuthorizedSession(control.username, control.password) + self.url = control.hostURL + 'api/wellness/' + self.data = { + 'answerValid': True, + 'timestamp': datetime, + 'userAnswer': True + } + response = api.post(self.session, self.url, self.data) + if not response.status_code == 201: + pytest.fail('Expected 201 OK, got {0}.'\ + .format(response.status_code)) + +# Verify that a student can answer if they are asymptomatic (false) +# Endpoint -- api/wellness/ +# Expected Status Code -- 201 Created +# Expected Response Body -- none + def test_post_wellness_asymptomatic_student(self): + self.session = self.createAuthorizedSession(control.username, control.password) + self.url = control.hostURL + 'api/wellness/' + self.data = { + 'answerValid': True, + 'timestamp': datetime, + 'userAnswer': False + } + response = api.post(self.session, self.url, self.data) + if not response.status_code == 201: + pytest.fail('Expected 201 OK, got {0}.'\ + .format(response.status_code)) + +# Verify that a student can't change the questions +# Endpoint -- api/wellness/question +# Expected Status Code -- 404 Method Not Allowed +# Expected Response Body -- A method not allowed error message + def test_post_wellness_question_session(self): + self.session = self.createAuthorizedSession(control.username, control.password) + self.url = control.hostURL + 'api/wellness/question' + self.data = { + 'yesPrompt': 'Trying to change', + 'question': 'No questions', + 'noPrompt': 'Have a nice day of testing' + } + response = api.post(self.session, self.url, self.data) + if not response.status_code == 405: + pytest.fail('Expected 405 Not Found, got {0}.'\ + .format(response.status_code)) + try: + assert response.json()['Message'] == \ + "The requested resource does not support http method 'POST'." + except ValueError: + pytest.fail('Expected Json response body, got {0}.'\ + .format(response.text)) + +# Verify that a faculty user can get their current status +# Endpoint -- api/wellness/ +# Expected Status Code -- 200 OK +# Expected Response Body -- A list of one dictionary with user answer + def test_get_wellness_asymptomatic_faculty(self): + self.session = \ + self.createAuthorizedSession(control.leader_username, control.leader_password) + self.url = control.hostURL + 'api/wellness/' + response = api.get(self.session, self.url) + + if not response.status_code == 200: + pytest.fail('Expected 200 OK, got {0}.'\ + .format(response.status_code)) + try: + response.json() + except ValueError: + pytest.fail('Expected Json respone body, got {0}.'\ + .format(response.text)) + if not (type(response.json()) is list): + warnings.warn("Response is not a list.") + assert response.json()[0]["answerValid"] == True + assert response.json()[0]["userAnswer"] == True or \ + response.json()[0]["userAnswer"] == False + +# Verify that a faculty user can get the wellness check question +# Endpoint -- api/wellness/Question +# Expected Status Code -- 200 OK +# Expected Response Body -- A list of a dictionary of questions +# and prompts. + def test_get_wellness_question_faculty(self): + self.session = \ + self.createAuthorizedSession(control.leader_username, control.leader_password) + self.url = control.hostURL + 'api/wellness/question/' + response = api.get(self.session, self.url) + + if not response.status_code == 200: + pytest.fail('Expected 200 OK, got {0}.'\ + .format(response.status_code)) + if not (type(response.json()) is list): + warnings.warn("Response is not a list.") + assert response.json()[0].has_key('yesPrompt') + assert response.json()[0].has_key('noPrompt') + assert response.json()[0].has_key('question') + +# Verify that a faculty user can answer if they are symptomatic (true) +# Endpoint -- api/wellness/ +# Expected Status Code -- 201 Created +# Expected Response Body -- none + def test_post_wellness_symptomatic_faculty(self): + self.session = self.createAuthorizedSession(control.leader_username, control.leader_password) + self.url = control.hostURL + 'api/wellness/' + self.data = { + 'answerValid': True, + 'timestamp': datetime, + 'userAnswer': True + } + response = api.post(self.session, self.url, self.data) + if not response.status_code == 201: + pytest.fail('Expected 201 OK, got {0}.'\ + .format(response.status_code)) + +# Verify that a faculty user can answer if they are asymptomatic (false) +# Endpoint -- api/wellness/ +# Expected Status Code -- 201 Created +# Expected Response Body -- none + def test_post_wellness_asymptomatic_faculty(self): + self.session = self.createAuthorizedSession(control.leader_username, control.leader_password) + self.url = control.hostURL + 'api/wellness/' + self.data = { + 'answerValid': True, + 'timestamp': datetime, + 'userAnswer': False + } + response = api.post(self.session, self.url, self.data) + if not response.status_code == 201: + pytest.fail('Expected 201 OK, got {0}.'\ + .format(response.status_code)) + +# Verify that a faculty user can't change the questions +# Endpoint -- api/wellness/question +# Expected Status Code -- 405 Method Not Allowed +# Expected Response Body -- A method not allowed error message + def test_post_wellness_question_faculty(self): + self.session = \ + self.createAuthorizedSession(control.leader_username, control.leader_password) + self.url = control.hostURL + 'api/wellness/question' + self.data = { + 'yesPrompt': 'Trying to change', + 'question': 'No questions', + 'noPrompt': 'Have a nice day of testing' + } + response = api.post(self.session, self.url, self.data) + if not response.status_code == 405: + pytest.fail('Expected 405 Not Found, got {0}.'\ + .format(response.status_code)) + try: + assert response.json()['Message'] == \ + "The requested resource does not support http method 'POST'." + except ValueError: + pytest.fail('Expected Json response body, got {0}.'\ + .format(response.text)) + +# Verify that a guest can't get their current status +# Endpoint -- api/wellness/ +# Expected Status Code -- 401 Unauthorized Error +# Expected Response Body -- An authorization denied error + def test_get_wellness_asymptomatic_guest(self): + self.session = self.createGuestSession() + self.url = control.hostURL + 'api/wellness/' + response = api.get(self.session, self.url) + + if not response.status_code == 401: + pytest.fail('Expected 401 Unauthorized Error, got {0}.'\ + .format(response.status_code)) + try: + assert response.json()['Message'] == control.AUTHORIZATION_DENIED + except ValueError: + pytest.fail('Expected Json response body, got{0}.'\ + .format(response.text)) + +# Verify that a guest can't get the wellness check question +# Endpoint -- api/wellness/Question +# Expected Status Code -- 401 Unauthorized Error +# Expected Response Body -- An authorization denied error + def test_get_wellness_question_guest(self): + self.session = self.createGuestSession() + self.url = control.hostURL + 'api/wellness/question/' + response = api.get(self.session, self.url) + + if not response.status_code == 401: + pytest.fail('Expected 401 Unauthorized Error, got {0}.'\ + .format(response.status_code)) + try: + assert response.json()['Message'] == control.AUTHORIZATION_DENIED + except ValueError: + pytest.fail('Expected Json response body, got{0}.'\ + .format(response.text)) + +# Verify that a guest can't answer if they are symptomatic (true) +# Endpoint -- api/wellness/ +# Expected Status Code -- 401 Unauthorized Error +# Expected Response Body -- An authorization denied error + def test_post_wellness_symptomatic_guest(self): + self.session = self.createGuestSession() + self.url = control.hostURL + 'api/wellness/' + self.data = { + 'answerValid': True, + 'timestamp': datetime, + 'userAnswer': True + } + response = api.post(self.session, self.url, self.data) + + if not response.status_code == 401: + pytest.fail('Expected 401 Unauthorized Error, got {0}.'\ + .format(response.status_code)) + try: + assert response.json()['Message'] == control.AUTHORIZATION_DENIED + except ValueError: + pytest.fail('Expected Json response body, got{0}.'\ + .format(response.text)) + + +# Verify that a guest can't answer if they are asymptomatic (false) +# Endpoint -- api/wellness/ +# Expected Status Code -- 401 Unauthorized Error +# Expected Response Body -- An authorization denied error + def test_post_wellness_asymptomatic_guest(self): + self.session = self.createGuestSession() + self.url = control.hostURL + 'api/wellness/' + self.data = { + 'answerValid': True, + 'timestamp': datetime, + 'userAnswer': False + } + response = api.post(self.session, self.url, self.data) + + if not response.status_code == 401: + pytest.fail('Expected 401 Unauthorized Error, got {0}.'\ + .format(response.status_code)) + try: + assert response.json()['Message'] == control.AUTHORIZATION_DENIED + except ValueError: + pytest.fail('Expected Json response body, got{0}.'\ + .format(response.text)) + + +# Verify that a guest can't change the questions +# Endpoint -- api/wellness/question +# Expected Status Code -- 404 Method Not Allowed +# Expected Response Body -- A method not allowed error message + def test_post_wellness_question_guest(self): + self.session = self.createAuthorizedSession(control.username, control.password) + self.url = control.hostURL + 'api/wellness/question' + self.data = { + 'yesPrompt': 'Trying to change', + 'question': 'No questions', + 'noPrompt': 'Have a nice day of testing' + } + response = api.post(self.session, self.url, self.data) + if not response.status_code == 405: + pytest.fail('Expected 405 Not Found, got {0}.'\ + .format(response.status_code)) + try: + assert response.json()['Message'] == \ + "The requested resource does not support http method 'POST'." + except ValueError: + pytest.fail('Expected Json response body, got {0}.'\ + .format(response.text)) \ No newline at end of file diff --git a/Tests/ApiEndpoints/test_crendentials.py b/Tests/ApiEndpoints/test_crendentials.py deleted file mode 100644 index 18fd77d53..000000000 --- a/Tests/ApiEndpoints/test_crendentials.py +++ /dev/null @@ -1,6 +0,0 @@ -username = '360.studenttest' -password = 'Gordon16' -id_number = 999999097 -username_activity_leader = '360.facultytest' -password_activity_leader = 'Gordon16' -id_number_activity_leader = 999999099 diff --git a/Tests/ApiEndpoints/test_gordon360_pytest.py b/Tests/ApiEndpoints/test_gordon360_pytest.py index add1c4a0e..e1671817d 100644 --- a/Tests/ApiEndpoints/test_gordon360_pytest.py +++ b/Tests/ApiEndpoints/test_gordon360_pytest.py @@ -7,13 +7,38 @@ import credentials import pytest_components as api + # # # # # # # # # # Configuration # # # # # # # # # # # Membership # Activity to use for testing -activity_code = 'AJG' +activity_code_AJG = 'AJG' +activity_code_360 = '360' +# Description to use for testing +activity_description_AJG = 'A. J. Gordon Scholars Program' +activity_description_360 = '360.gordon.edu' +# Image path to use for testing +activity_image_path_AJG = \ + 'https://360apitrain.gordon.edu/browseable/uploads/AJG/canvasImage.png' +activity_image_path_360 = \ + 'https://360apitrain.gordon.edu/browseable/uploads/360/canvasImage.png' +# Blurb to use for testing +activity_blurb_AJG = 'DOING TESTS, IGNORE' +activity_blurb_360 = 'This is me changing the description' +# URL to use for testing +activity_URL_AJG = 'http://www.lolcats.com/' +activity_URL_360 = 'http://360.gordon.edu' +# Type to use for testing +activity_type_AJG = 'LEA' +activity_type_360 = 'STU' +# Type description to use for testing +activity_type_description_AJG = 'Leadership Program' +activity_type_description_360 = 'Student Life' +# Join info to use for testing +activity_join_info_AJG = '' +activity_join_info_360 = 'me adding special information' # Id number to use for testing valid_id_number = 50146557 # Session to use for testing @@ -26,2504 +51,79 @@ begin_date = '06/10/2016' end_date = '07/16/2016' -email = '360.studenttest@gordon.edu' +_email = '360.studenttest@gordon.edu' # Comments comments = 'Generated by 360-Gordon-Test. IGNORE' -#comments = 'Generated by Gordon 360 API Test Suite. IGNORE' +# comments = 'Generated by Gordon 360 API Test Suite. IGNORE' searchString = 'michael' searchString2 = 'lindsay' -#Event or Type ID used for events testing +# Event or Type ID used for events testing Event_OR_Type_ID = '10' -# Profile image -# Profile picture for testing -FILE_PATH = '\\gotrain\pref_photos' -FILE_NAME = 'profile.jpg' +# Profile image path +FILE_PATH_PROFILE = r'..\..\Gordon360\browseable\profile\Default\profile.png' +FILE_PATH_ID = r'..\..\Gordon360\browseable\profile\Default\ID.png' -# API +# API. Choose only 1. +# localhost set up using Visual Studio to enable local testing. hostURL = 'https://360ApiTrain.gordon.edu/' -#hostURL = 'http://localhost:7777/' +#hostURL = 'http://localhost:1235/' # Constants LEADERSHIP_POSITIONS = ['CAPT','CODIR','CORD','DIREC','PRES','VICEC','VICEP'] REQUEST_STATUS_APPROVED = 'Approved' REQUEST_STATUS_DENIED = 'Denied' REQUEST_STATUS_PENDING = 'Pending' +AUTHORIZATION_DENIED = 'Authorization has been denied for this request.' # Configuration Details username = credentials.username password = credentials.password my_id_number = credentials.id_number -grant_payload = { 'username':username, 'password':password, 'grant_type':'password' } +grant_payload = \ + { 'username':username, 'password':password, 'grant_type':'password' } leader_username = credentials.username_activity_leader leader_password = credentials.password_activity_leader leader_id_number = credentials.id_number_activity_leader -leader_grant_payload = { 'username':leader_username, 'password':leader_password, 'grant_type':'password' } +leader_grant_payload = { 'username':leader_username, \ + 'password':leader_password, 'grant_type':'password' } # Global variables for myschedule test events event_id = '10000' location = 'KOSC 244' description = 'Summer Practicum' -begintime = '09:00:00.0000000' -endtime = '17:00:00.0000000' +begintime = '09:00:00' +endtime = '17:00:00' -#Global variable for new description for test events +# Global variable for new description for test events put_description = 'DOING TESTS - IGNORE' shortened_begintime = '09:00:00' shortened_endtime = '17:00:00' +# Pre-conditions. +# Statically disabled/enabled tests that have yet to be resolved. +cctService = False +enrolledInPracticum = False +unknownPrecondition = False + + +# Logins class testCase: + # Create an authorized session to test authorized calls. def createAuthorizedSession(self, userLogin, userPassword): - # Create an authorized session to test authorized calls. - r = requests.post(hostURL+'token', { 'username':userLogin, 'password':userPassword, 'grant_type':'password' }) + r = requests.post(hostURL+'token', { 'username':userLogin, \ + 'password':userPassword, 'grant_type':'password' }) access_token = r.json()["access_token"] authorization_header = "Bearer " + access_token authorized_session = requests.Session() authorized_session.verify = True - authorized_session.headers.update({ "Authorization":authorization_header }) + authorized_session.headers.update({ \ + "Authorization":authorization_header }) return authorized_session - + # Create a guest session to test guest calls. def createGuestSession(self): authorized_session = requests.Session() return authorized_session - -class Test_allScheduleControlTest(testCase): - -# # # # # # # # # # # # # -# SCHEDULECONTROL TESTS # -# # # # # # # # # # # # # - -# Get the privacy, time last updated, description, and Gordon ID -# of the currently logged in user's schedule. -# Endpoint -- api/schedulecontrol -# Expected Status code -- 200 Ok -# Expected Content -- all schedule objects of the currently logged in user. - def test_get_all_schedulecontrol_objects_of_current_user(self): - self.session = self.createAuthorizedSession(username, password) - self.url = hostURL + 'api/schedulecontrol/' - self.token_payload = { 'username':username, 'password':password, 'grant_type':'password' } - response = api.get(self.session, self.url) - - if not response.status_code == 200: - pytest.fail('Expected 200 OK, got {0}.'.format(response.status_code)) - try: - response.json() - except ValueError: - pytest.fail('Expected Json, got {0}.'.format(response.text)) - -# Get the privacy, time last updated, description, and Gordon ID of a user's schedule -# with username `username` as a parameter. -# Endpoint -- api/schedulecontrol/{username} -# Expected Status code -- 200 Ok -# Expected Content -- all schedule objects of the currently logged in user. - def test_get_all_schedulecontrol_objects_of_user(self): - self.session = self.createAuthorizedSession(username, password) - self.url = hostURL + 'api/schedulecontrol/' + leader_username + '/' - self.token_payload = { 'username':username, 'password':password, 'grant_type':'password' } - response = api.get(self.session, self.url) - - if not response.status_code == 200: - pytest.fail('Expected 200 OK, got {0}.'.format(response.status_code)) - try: - response.json() - except ValueError: - pytest.fail('Expected Json, got {0}.'.format(response.text)) - -# Update schedule privacy of the currently logged in user. -# Endpoint -- api/schedulecontrol/privacy/{value} -# Expected Status code -- 200 Ok -# Expected Content -- schedule privacy of the currently logged in user. - def test_schedulecontrol_put_privacy(self): - self.session = self.createAuthorizedSession(username, password) - self.url = hostURL + 'api/schedulecontrol/privacy/N/' - response = api.put(self.session, self.url, 'N') - if not response.status_code == 200: - pytest.fail('Expected 200 OK, got {0}.'.format(response.status_code)) - self.url = hostURL + 'api/schedulecontrol/' - response = api.get(self.session, self.url) - if not response.status_code == 200: - pytest.fail('Expected 200 OK, got {0}.'.format(response.status_code)) - assert response.json()["IsSchedulePrivate"] == 0 - -# Update the schedule description of the currently logged in user. -# Endpoint -- api/schedulecontrol/description/{value} -# Expected Status code -- 200 Ok -# Expected Content -- schedule description of the currently logged in user. - def test_schedulecontrol_put_description(self): - self.session = self.createAuthorizedSession(username, password) - self.url = hostURL + 'api/schedulecontrol/description/' + put_description + '/' - response = api.put(self.session, self.url, put_description) - if not response.status_code == 200: - pytest.fail('Expected 200 OK, got {0}.'.format(response.status_code)) - self.url = hostURL + 'api/schedulecontrol/' - response = api.get(self.session, self.url) - if not response.status_code == 200: - pytest.fail('Expected 200 OK, got {0}.'.format(response.status_code)) - assert response.json()["Description"] == put_description - - - -class Test_allMyScheduleTest(testCase): - - -# # # # # # # # # # -# MYSCHEDULE TESTS # -# # # # # # # # # # - -# Get all custom events of the currently logged in user. -# Endpoint -- api/myschedule/ -# Expected Status code -- 200 Ok -# Expected Content -- all custom events of the currently logged in user. - def test_get_all_myschedule_objects_of_current_user(self): - self.session = self.createAuthorizedSession(username, password) - self.url = hostURL + 'api/myschedule/' - response = api.get(self.session, self.url) - - if not response.status_code == 200: - pytest.fail('Expected 200 OK, got {0}.'.format(response.status_code)) - try: - response.json() - except ValueError: - pytest.fail('Expected Json, got {0}.'.format(response.text)) - assert response.json()[0]["EVENT_ID"] == event_id - - -# Get all custom events of a user with username `username` as a parameter. -# Endpoint -- api/myschedule/{username} -# Expected Status code -- 200 Ok -# Expected Content -- all custom events of a user with username `username` as a parameter - def test_get_all_myschedule_objects_of_user(self): - self.session = self.createAuthorizedSession(username, password) - self.url = hostURL + 'api/myschedule/' + leader_username + '/' - response = api.get(self.session, self.url) - - if not response.status_code == 200: - pytest.fail('Expected 200 OK, got {0}.'.format(response.status_code)) - try: - response.json() - except ValueError: - pytest.fail('Expected Json, got {0}.'.format(response.text)) - assert response.json()[0]["EVENT_ID"] == '1100' - assert response.json()[0]["GORDON_ID"] == str(leader_id_number) - -# Get a specific custom event of the currently logged in user with `eventId` as a parameter -# Endpoint -- api/myschedule/event/{eventID} -# Expected Status code -- 200 Ok -# Expected Content -- a specific custom event of the currently logged in user with `eventId` -# as a parameter - def test_get_myschedule_objects_of_id(self): - self.session = self.createAuthorizedSession(username, password) - self.url = hostURL + 'api/myschedule/event/' + event_id + '/' - response = api.get(self.session, self.url) - - if not response.status_code == 200: - pytest.fail('Expected 200 OK, got {0}.'.format(response.status_code)) - try: - response.json() - except ValueError: - pytest.fail('Expected Json, got {0}.'.format(response.text)) - assert response.json()["EVENT_ID"] == event_id - -# Create a custom event of the currently logged in user. -# Expectations: -# Endpoints -- api/myschedule/ -# Expected Status Code -- 201 Created. -# Expected Content -- a custom event with the data in the test - def test_myschedule_post(self): - self.session = self.createAuthorizedSession(username, password) - self.url = hostURL + 'api/myschedule/' - self.data = { - 'GORDON_ID' : str(my_id_number), - 'LOCATION' : location, - 'DESCRIPTION' : description, - 'TUE_CDE' : 'T', - 'IS_ALLDAY' : 1, - } - response = api.postAsJson(self.session, self.url, self.data) - if not response.status_code == 201: - pytest.fail('Expected 201 Created, got {0}.'.format(response.status_code)) - try: - response.json() - except ValueError: - pytest.fail('Expected Json response body, got {0}.'.format(response.text)) - assert response.json()["GORDON_ID"] == str(my_id_number) - assert response.json()["LOCATION"] == location - assert response.json()["DESCRIPTION"] == description - - # delete the test post - # Expectations: - # Expected Status Code -- 200 OK. - try: - self.GordonID = response.json()["GORDON_ID"] - if self.GordonID == str(my_id_number): - response = api.delete(self.session, self.url + str(response.json()["EVENT_ID"])) - except KeyError: - pytest.fail('Expected REQUEST_ID in response body, got {0}.'.format(response.json())) - if not response.status_code == 200: - pytest.fail('Expected 200 OK, got {0}.'.format(response.status_code)) - -# Update a custom event of the currently logged in user. -# Expectations: -# Endpoints -- api/myschedule/ -# Expected Status Code -- 200 OK. -# Expected Content -- The Json object (custom event) with a GORDON_ID attribute. - def test_myschedule_put(self , session=None): - session = None - self.session = self.createAuthorizedSession(username, password) - self.url = hostURL + 'api/myschedule/' - try: - self.data = { - 'EVENT_ID' : event_id, - 'GORDON_ID' : str(my_id_number), - 'LOCATION' : location, - 'DESCRIPTION' : put_description, - 'MON_CDE' : 'M', - 'TUE_CDE' : 'T', - 'WED_CDE' : 'W', - 'THU_CDE' : 'R', - 'FRI_CDE' : 'F', - 'IS_ALLDAY' : 0, - 'BEGIN_TIME' : begintime, - 'END_TIME' : endtime, - } - except (KeyError, ValueError): - pytest.fail('Error in setup.') - response = api.putAsJson(self.session, self.url, self.data) - if not response.status_code == 200: - pytest.fail('Expected 200 OK, got {0}.'.format(response.status_code)) - try: - response.json() - except ValueError: - pytest.fail('Expected Json response body, got {0}.'.format(response.text)) - assert response.json()["GORDON_ID"] == str(my_id_number) - assert response.json()["LOCATION"] == location - assert response.json()["DESCRIPTION"] == put_description - assert response.json()["BEGIN_TIME"] == shortened_begintime - assert response.json()["END_TIME"] == shortened_endtime - - -class Test_allScheduleTest(testCase): - - -# # # # # # # # # -# SCHEDULE TESTS # -# # # # # # # # # - -# Get all schedule objects of the currently logged in user. -# Endpoint -- api/schedule/:username -# Expected Status code -- 200 Ok -# Expected Content -- all schedule objects of the currently logged in user. - def test_get_all_schedule_objects_of_current_user(self): - session = None - self.session = self.createAuthorizedSession(username, password) - self.url = hostURL + 'api/schedule/' + username + '/' - response = api.get(self.session, self.url) - - if not response.status_code == 200: - pytest.fail('Expected 200 OK, got {0}.'.format(response.status_code)) - try: - response.json() - except ValueError: - pytest.fail('Expected Json, got {0}.'.format(response.text)) - assert response.json()[0]["CRS_TITLE"] == "SUMMER PRACTICUM COMPUTER SCIENCE" - - -# Get all schedule objects of a user with username `username` as a parameter. -# Endpoint -- api/schedule/:username -# Expected Status code -- 200 Ok -# Expected Content -- all schedule objects of a user with username `username` as a parameter - def test_get_all_schedule_objects_of_user(self): - session = None - self.session = self.createAuthorizedSession(username, password) - self.url = hostURL + 'api/schedule/' + leader_username + '/' - response = api.get(self.session, self.url) - - if not response.status_code == 200: - pytest.fail('Expected 200 OK, got {0}.'.format(response.status_code)) - try: - response.json() - except ValueError: - pytest.fail('Expected Json, got {0}.'.format(response.text)) - assert response.json()[0]["GORDON_ID"] == str(leader_id_number) - - - -class Test_allAuthenticationTest(testCase): - -# # # # # # # # # # # # -# AUTHENTICATION TESTS # -# # # # # # # # # # # # - -# Given valid credentials, verify that authentication is successful for a student/member. -# Endpoint -- token/ -# Expected Status code -- 200 Ok -# Expected Content -- Json Object with access_token attribute. - def test_authenticate_with_valid_credentials_as_student(self): - session = None - self.session = requests.Session() - self.url = hostURL + 'token' - self.token_payload = { 'username':username, 'password':password, 'grant_type':'password' } - response = api.post(self.session, self.url, self.token_payload) - - if not response.status_code == 200: - pytest.fail('Expected 200 OK, got {0}.'.format(response.status_code)) - try: - response.json() - except ValueError: - pytest.fail('Expected Json, got {0}.'.format(response.text)) - if not 'access_token' in response.json(): - pytest.fail('Expected access token in response, got {0}.'.format(response.json())) - -# Given valid credentials, verify that authentication is successful for a faculty/leader/god. -# Endpoint -- token/ -# Expected Status code -- 200 Ok -# Expected Content -- Json Object with access_token attribute. - def test_authenticate_with_valid_credentials___activity_leader(self): - session = None - self.session = requests.Session() - self.url = hostURL + 'token' - self.token_payload = { 'username':leader_username, 'password':leader_password, 'grant_type':'password' } - response = api.post(self.session, self.url, self.token_payload) - if not response.status_code == 200: - pytest.fail('Expected 200 OK, got {0}.'.format(response.status_code)) - try: - response.json() - except ValueError: - pytest.fail('Expected Json, got {0}.'.format(response.text)) - if not 'access_token' in response.json(): - pytest.fail('Expected access token in response, got {0}.'.format(response.json())) - -class Test_allAccountTest(testCase): - -# # # # # # # # # # # # -# ACCOUNT TESTS # -# # # # # # # # # # # # - -# Verify that a user can get account by email -# Endpoint -- api/accounts/email/{email} -# Expected Status Code -- 200 OK -# Expected Respones Body -- profile of the email person - def test_get_student_by_email(self): - self.session = self.createAuthorizedSession(username, password) - self.url = hostURL + 'api/accounts/email/' + email + '/' - response = api.get(self.session, self.url) - - if not response.status_code == 200: - pytest.fail('Expected 200 OK, got {0}.'.format(response.status_code)) - try: - response.json() - except ValueError: - pytest.fail('Expected Json response body, got {0}.'.format(response.text)) - assert response.json()["GordonID"] == str(my_id_number) - assert response.json()["FirstName"] == "360" - assert response.json()["LastName"] == "StudentTest" - assert response.json()["Email"] == "360.StudentTest@gordon.edu" - assert response.json()["ADUserName"] == "360.StudentTest" - assert response.json()["AccountType"] == "STUDENT" - assert response.json()["Barcode"] == "21607000485992" - assert response.json()["show_pic"] == 0 - assert response.json()["ReadOnly"] == 0 - assert response.json()["account_id"] == 30578 - -# Verify that a user can search someone by a word -# Endpoint -- api/accounts/search/:word -# Expected Status Code -- 200 OK -# Expected Respones Body -- any info that has the word - def test_get_search_by_string(self): - self.session = self.createAuthorizedSession(username, password) - self.url = hostURL + 'api/accounts/search/' + searchString + '/' - response = api.get(self.session, self.url) - if not response.status_code == 200: - pytest.fail('Expected 200 OK, got {0}.'.format(response.status_code)) - try: - response.json() - except ValueError: - pytest.fail('Expected Json response body, got {0}.'.format(response.text)) - assert response.json()[0]["FirstName"].lower() == searchString.lower() - -# Verify that a user can search someone by two words -# Endpoint -- api/accounts/search/:word/:word2 -# Expected Status Code -- 200 OK -# Expected Respones Body -- any info that has both of words - def test_get_search_by_two_string(self): - self.session = self.createAuthorizedSession(username, password) - self.url = hostURL + 'api/accounts/search/' + searchString + '/' + searchString2 + '/' - response = api.get(self.session, self.url) - if not response.status_code == 200: - pytest.fail('Expected 200 OK, got {0}.'.format(response.status_code)) - try: - response.json() - except ValueError: - pytest.fail('Expected Json response body, got {0}.'.format(response.text)) - assert searchString in response.json()[0]["FirstName"].lower() - assert searchString2 in response.json()[0]["LastName"].lower() - -# Verify that an user can search by username -# Endpoint -- api/accounts/username/{username} -# Expected Status Code -- 200 OK -# Expected Respones Body -- profile info of {username} - def test_get_search_by_username(self): - self.session = self.createAuthorizedSession(username, password) - self.url = hostURL + 'api/accounts/username/' + leader_username + '/' - response = api.get(self.session, self.url) - if not response.status_code == 200: - pytest.fail('Expected 200 OK, got {0}.'.format(response.status_code)) - try: - response.json() - except ValueError: - pytest.fail('Expected Json response body, got {0}.'.format(response.text)) - assert response.json()["ADUserName"].lower() == leader_username.lower() - assert response.json()["GordonID"] == str(leader_id_number) - assert response.json()["FirstName"] == "360" - assert response.json()["LastName"] == "360" - assert response.json()["Email"] == "360.FacultyTest@gordon.edu" - assert response.json()["ADUserName"] == "360.FacultyTest" - assert response.json()["AccountType"] == "FACULTY" - assert response.json()["Barcode"] == "21607000486016" - assert response.json()["show_pic"] == 1 - assert response.json()["ReadOnly"] == 0 - assert response.json()["account_id"] == 30580 - -class Test_AllEmailTest(testCase): -# # # # # # # # -# EMAIL TEST # -# # # # # # # # - -# Verify that a student can get a list of the emails for all members in the activity -# Endpoint -- api/emails/activity/{activity_ID} -# Expected Status Code -- 200 OK -# Expected Response Body -- A json response with the student resource - def test_get_list_of_emails(self): - self.session = self.createAuthorizedSession(username, password) - self.url = hostURL + 'api/emails/activity/' + activity_code + '/' - response = api.get(self.session, self.url) - if not response.status_code == 200: - pytest.fail('Expected 200 OK, got {0}.'.format(response.status_code)) - try: - response.json() - except ValueError: - pytest.fail('Expected Json response body, got{0}.'.format(response.text)) - -# Verify that an activity leader can get the emails for the members of an activity in specific session code -# Endpoint -- api/emails/activity/:id -# Expected Status Code -- 200 OK -# Expected Response Body -- A list of json objects - def test_get_emails_for_activity___activity_leader(self): - self.session = self.createAuthorizedSession(leader_username, leader_password) - self.url = hostURL + 'api/emails/activity/' + activity_code + '/session/201809/' - response = api.get(self.session, self.url) - if not response.status_code == 200: - pytest.fail('Expected 200 OK, got {0}.'.format(response.status_code)) - try: - response.json() - except ValueError: - pytest.fail('Expected Json in response body, got {0}.'.format(response.text)) - if not (type(response.json()) is list): - pytest.fail('Expected list, got {0}.'.format(response.json)) - assert response.json()[0]['Email'] == "Chris.Carlson@gordon.edu" - assert response.json()[1]['Email'] == "Emmy.Short@gordon.edu" - -# Verify that a supervisor can get the emails for any activity leader -# Endpoint -- api/emails/activity/:id/leaders -# Expected Status Code -- 200 OK -# Expected Respones Body -- Json response with a list of emails - def test_get_all_leader_emails___supervisor(self): - self.session = self.createAuthorizedSession(leader_username, leader_password) - self.url = hostURL + 'api/emails/activity/' + activity_code + '/leaders/' - response = api.get(self.session, self.url) - if not response.status_code == 200: - pytest.fail('Expected 200 OK, got {0}.'.format(response.status_code)) - try: - response.json() - except ValueError: - pytest.fail('Expected Json response body, got {0}.'.format(response.text)) - -# Verify that a supervisor can get the emails for any group_admin -# Endpoint -- api/emails/activity/:id/group-admin/session/{sessioncode} -# Expected Status Code -- 200 OK -# Expected Respones Body -- Json response with a list of emails - def test_get_emails_for_group_admin___supervisor(self): - self.session = self.createAuthorizedSession(leader_username, leader_password) - self.url = hostURL + 'api/emails/activity/' + activity_code + '/group-admin/session/201809/' - response = api.get(self.session, self.url) - if not response.status_code == 200: - pytest.fail('Expected 200 OK, got {0}.'.format(response.status_code)) - try: - response.json() - except ValueError: - pytest.fail('Expected Json response body, got {0}.'.format(response.text)) - try: - assert response.json()[0]['Email'] == "Chris.Carlson@gordon.edu" - except KeyError: - pytest.fail('Expected Email in response, got{0}.'.format(response.json())) - -# Verify that a supervisor can get the emails for any activity leader based on a session code -# Endpoint -- api/emails/activity/:id/leaders/session/:sessionCode -# Expected Status Code -- 200 OK -# Expected Respones Body -- Json response with a list of emails - def test_get_emails_for_leaders___supervisor(self): - self.session = self.createAuthorizedSession(leader_username, leader_password) - self.url = hostURL + 'api/emails/activity/' + activity_code + '/leaders/session/201809/' - - response = api.get(self.session, self.url) - if not response.status_code == 200: - pytest.fail('Expected 200 OK, got {0}.'.format(response.status_code)) - try: - response.json() - except ValueError: - pytest.fail('Expected Json response body, got {0}.'.format(response.text)) - assert response.json()[0]['Email'] == "Emmy.Short@gordon.edu" - assert response.json()[0]['FirstName'] == "Emmy" - assert response.json()[0]['LastName'] == "Short" - -# Verify that a leader can get the student's advisor based on sesson code. -# Endpoint -- api/emails/activity/AJG/advisors/session/201809 -# Expected Status Code -- 200 OK -# Expected Response Body -- A json response with the student resource - def test_get_student_by_email___advisor(self): - self.session = self.createAuthorizedSession(leader_username, leader_password) - self.url = hostURL + 'api/emails/activity/AJG/advisors/session/201809' - response = api.get(self.session, self.url) - if not response.status_code == 200: - pytest.fail('Expected 200 OK, got {0}.'.format(response.status_code)) - try: - response.json() - except ValueError: - pytest.fail('Expected Json response body, got{0}.'.format(response.text)) - assert response.json()[0]['Email'] == "Chris.Carlson@gordon.edu" - assert response.json()[0]['FirstName'] == "Christopher" - assert response.json()[0]['LastName'] == "Carlson" - -# Verify that a supervisor can get the emails for any advisor -# Endpoint -- api/emails/activity/:id/advisor -# Expected Status Code -- 200 OK -# Expected Respones Body -- Json response with a list of emails - def test_get_all_leader_emails___supervisor(self): - self.session = self.createAuthorizedSession(leader_username, leader_password) - self.url = hostURL + 'api/emails/activity/' + activity_code + '/advisors/' - response = api.get(self.session, self.url) - if not response.status_code == 200: - pytest.fail('Expected 200 OK, got {0}.'.format(response.status_code)) - try: - response.json() - except ValueError: - pytest.fail('Expected Json response body, got {0}.'.format(response.text)) - -# Verify that a supervisor can get the emails for any advisors based on sessioncode -# Endpoint -- api/emails/activity/:id/advisors/session/{sessioncode} -# Expected Status Code -- 200 OK -# Expected Respones Body -- Json response with a list of emails - def test_get_emails_for_group_admin___supervisor(self): - self.session = self.createAuthorizedSession(leader_username, leader_password) - self.url = hostURL + 'api/emails/activity/' + activity_code + '/advisors/session/201809/' - response = api.get(self.session, self.url) - if not response.status_code == 200: - pytest.fail('Expected 200 OK, got {0}.'.format(response.status_code)) - try: - response.json() - except ValueError: - pytest.fail('Expected Json response body, got {0}.'.format(response.text)) - assert response.json()[0]['Email'] == "Chris.Carlson@gordon.edu" - assert response.json()[0]['FirstName'] == "Christopher" - assert response.json()[0]['LastName'] == "Carlson" - -class Test_allEventsTest(testCase): - -# # # # # # # # # # # # -# EVENTS & CLAW TESTS # -# # # # # # # # # # # # - -# Verify that a student can get all their own chapel events -# Endpoint -- api/events/chapel -# Expected Status Code -- 200 OK -# Expected Respones Body -- list of all chapel events attended by the user - def test_get_all_chapel_events(self): - self.session = self.createAuthorizedSession(username, password) - self.url = hostURL + 'api/events/chapel/' - response = api.get(self.session, self.url) - if not response.status_code == 200: - pytest.fail('Expected 200 OK, got {0}.'.format(response.status_code)) - try: - response.json() - except ValueError: - pytest.fail('Expected Json response body, got {0}.'.format(response.text)) - if not (type(response.json()) is list): - pytest.fail('Expected list, got {0}.'.format(response.json())) - -# Verify that an user can get all chapel events by username in specific term (ex: FA16) -# Endpoint -- api/events/chapel/:username/:term -# Expected Status Code -- 200 OK -# Expected Respones Body -- list of all chapel events attended by the user during term - def test_get_all_chapel_events_during_term(self): - self.session = self.createAuthorizedSession(username, password) - self.url = hostURL + 'api/events/chapel/' + term_code + '/' - response = api.get(self.session, self.url) - - if not response.status_code == 200: - pytest.fail('Expected 200 OK, got {0}.'.format(response.status_code)) - try: - response.json() - except ValueError: - pytest.fail('Expected Json response body, got {0}.'.format(response.text)) - if not (type(response.json()) is list): - pytest.fail('Expected list, got {0}.'.format(response.json())) - -# Verify that an user can get all events by type_ID -# Endpoint -- api/events/25Live/type/:Event_OR_Type_ID -# Expected Status Code -- 200 OK -# Expected Respones Body -- list of all events resources - def test_get_all_events___regular_member(self): - self.session = self.createAuthorizedSession(username, password) - self.url = hostURL + 'api/events/25Live/type/10' - response = api.get(self.session, self.url) - - if not response.status_code == 200: - pytest.fail('Expected 200 OK, got {0}.'.format(response.status_code)) - try: - response.json() - except ValueError: - pytest.fail('Expected Json response body, got {0}.'.format(response.text)) - if not (type(response.json()) is list): - pytest.fail('Expected list, got {0}.'.format(response.json())) - -# Verify that an user can get all events by multiple type_ID -# Endpoint -- api/events/25Live/type/:Event_OR_Type_ID -# Expected Status Code -- 200 OK -# Expected Respones Body -- list of all events resources - def test_get_all_events_multiple(self): - self.session = self.createAuthorizedSession(username, password) - self.url = hostURL + 'api/events/25Live/type/10$11$12$14' - response = api.get(self.session, self.url) - - if not response.status_code == 200: - pytest.fail('Expected 200 OK, got {0}.'.format(response.status_code)) - try: - response.json() - except ValueError: - pytest.fail('Expected Json response body, got {0}.'.format(response.text)) - if not (type(response.json()) is list): - pytest.fail('Expected list, got {0}.'.format(response.json())) - -# Verify that a regular member can get all upcoming chapel events (category_ID = 85) -# Endpoint -- api/events/25Live/CLAW -# Expected Status Code -- 200 OK -# Expected Respones Body -- list of all events resources - def test_get_all_claw(self): - self.session = self.createAuthorizedSession(username, password) - self.url = hostURL + 'api/events/25Live/CLAW' - response = api.get(self.session, self.url) - if not response.status_code == 200: - pytest.fail('Expected 200 OK, got {0}.'.format(response.status_code)) - try: - response.json() - except ValueError: - pytest.fail('Expected Json response body, got {0}.'.format(response.text)) - if not (type(response.json()) is list): - pytest.fail('Expected list, got {0}.'.format(response.json())) - -# Verify that an user can get all events in 25Live under predefined categories -# Endpoint -- api/events/25Live/All -# Expected Status Code -- 200 OK -# Expected Respones Body -- list of all events resources - def test_get_all_25Live(self): - self.session = self.createAuthorizedSession(username, password) - self.url = hostURL + 'api/events/25Live/All' - response = api.get(self.session, self.url) - if not response.status_code == 200: - pytest.fail('Expected 200 OK, got {0}.'.format(response.status_code)) - try: - response.json() - except ValueError: - pytest.fail('Expected Json response body, got {0}.'.format(response.text)) - if not (type(response.json()) is list): - pytest.fail('Expected list, got {0}.'.format(response.json())) - -# Verify that an user can get information on specific event on 25Live -# Endpoint -- api/events/25Live/:Event_ID (2911 = Chapel) -# Expected Status Code -- 200 OK -# Expected Respones Body -- list of all events resources - def test_get_all_25Live_by_event_id(self): - self.session = self.createAuthorizedSession(username, password) - self.url = hostURL + 'api/events/25Live/2911' - response = api.get(self.session, self.url) - if not response.status_code == 200: - pytest.fail('Expected 200 OK, got {0}.'.format(response.status_code)) - try: - response.json() - except ValueError: - pytest.fail('Expected Json response body, got {0}.'.format(response.text)) - if not (type(response.json()) is list): - pytest.fail('Expected list, got {0}.'.format(response.json())) - assert response.json()[0]['Organization'] == "Chapel Office" - assert response.json()[0]['Event_ID'] == '2911' - assert response.json()[0]['Event_Name'] == 'Chapel' - assert response.json()[0]['Event_Title'] == 'Chapel: David Kirika' - assert response.json()[0]['Event_Type_Name'] == 'Chapel/Worship' - -# Verify that a Guest can only get the public events on 25Live -# Endpoint -- api/events/25Live/Public -# Expected Status Code -- 200 OK -# Expected Respones Body -- list of all guest events resources - def test_get_all_public_events(self): - self.session = self.createGuestSession() - self.url = hostURL + 'api/events/25Live/Public' - response = api.get(self.session, self.url) - if not response.status_code == 200: - pytest.fail('Expect 200 OK, got {0}.'.format(response.status_code)) - try: - response.json() - except ValueError: - pytest.fail('Expected Json response body, got {0}.'.format(response.text)) - if not (type(response.json()) is list): - pytest.fail('Expected list, got {0}.'.format(response,json())) - for i in range(len(response.json())): - assert response.json()[i]['Requirement_Id'] == '3' - -class Test_allActivityTest(testCase): - -# # # # # # # # # -# ACTIVITY TESTS # -# # # # # # # # # - -# Verify that an activity leader can get all activities. -# Endpoint -- api/activities/ -# Expected Status Code -- 200 OK -# Expected Response Body -- List of activities - def test_get_all_activities___activity_leader(self): - self.session = self.createAuthorizedSession(leader_username, leader_password) - self.url = hostURL + 'api/activities/' - response = api.get(self.session, self.url) - if not response.status_code == 200: - pytest.fail('Expected 200 OK , got {0}.'.format(response.status_code)) - try: - response.json() - except ValueError: - pytest.fail('Expected Json response body, got {0}.'.format(respons.text)) - if not (type(response.json()) is list): - pytest.fail('Expected list, got {0}.'.format(response.json())) - assert response.json()[0]["ActivityCode"] == "360" - assert response.json()[0]["ActivityDescription"] == "360.gordon.edu" - assert response.json()[0]["ActivityImagePath"] == "https://360apitrain.gordon.edu/browseable/uploads/360/canvasImage.png" - assert response.json()[0]["ActivityBlurb"] == "" - assert response.json()[0]["ActivityURL"] == "http://360.gordon.edu" - assert response.json()[0]["ActivityType"] == "STU" - assert response.json()[0]["ActivityTypeDescription"] == "Student Life" - assert response.json()[0]["Privacy"] == False - assert response.json()[0]["ActivityJoinInfo"] == "" - -# Verify that a Guest can get all activities but only public info. -# Endpoint -- api/activities/ -# Expected Status Code -- 200 OK -# Expected Response Body -- List of activities - def test_get_all_activities___Guest(self): - self.session = self.createGuestSession() - self.url = hostURL + 'api/activities/360' - response = api.get(self.session, self.url) - if not response.status_code == 200: - pytest.fail('Expected 200 OK , got {0}.'.format(response.status_code)) - try: - response.json() - except ValueError: - pytest.fail('Expected Json response body, got {0}.'.format(respons.text)) - assert response.json()["ActivityCode"] == "360" - assert response.json()["ActivityDescription"] == "360.gordon.edu" - assert response.json()["ActivityImagePath"] == "https://360apitrain.gordon.edu/browseable/uploads/360/canvasImage.png" - assert response.json()["ActivityBlurb"] == "" - assert response.json()["ActivityURL"] == "http://360.gordon.edu" - assert response.json()["ActivityType"] == "STU" - assert response.json()["ActivityTypeDescription"] == "Student Life" - assert response.json()["Privacy"] == False - assert response.json()["ActivityJoinInfo"] == "" - - -# Verify that an activity leader can a single activity. -# Endpoint -- api/activities/{activityCode} -# Expected Status Code -- 200 OK -# Expected Response Body -- Json object with activity resource - def test_get_one_activity___activity_leader(self): - self.session = self.createAuthorizedSession(leader_username, leader_password) - self.url = hostURL + 'api/activities/AJG/' - response = api.get(self.session, self.url) - if not response.status_code == 200: - pytest.fail('Expected 200 OK, got {0}.'.format(response.status_code)) - try: - response.json() - except ValueError: - pytest.fail('Expected Json response body, got {0}.'.format(response.text)) - try: - response.json()['ActivityCode'] - except KeyError: - pytest.fail('Expected ACT_CDE in response, got {0}.'.format(response.json())) - assert response.json()["ActivityCode"] == "AJG" - assert response.json()["ActivityDescription"] == "A. J. Gordon Scholars Program" - assert response.json()["ActivityImagePath"] == "https://360api.gordon.edu/browseable/uploads/Default/activityImage.png" - assert response.json()["ActivityBlurb"] == "DOING TESTS, IGNORE" - assert response.json()["ActivityURL"] == "http://www.lolcats.com/" - assert response.json()["ActivityType"] == "LEA" - assert response.json()["ActivityTypeDescription"] == "Leadership Program" - assert response.json()["Privacy"] == True - assert response.json()["ActivityJoinInfo"] == "" - -# Verify that an activity leader can get all activities for specific session. -# Endpoint -- api/activities/session/{sessionCode} -# Expected Status Code -- 200 OK -# Expected Response Body -- list of activities - def test_get_activities_for_session___activity_leader(self): - self.session = self.createAuthorizedSession(leader_username, leader_password) - self.url = hostURL + 'api/activities/session/201809/' - self.sessionID = -1 - - response = api.get(self.session, self.url) - if not response.status_code == 200: - pytest.fail('Expected 200 OK, got {0}.'.format(response.json())) - try: - response.json() - except ValueError: - pytest.fail('Expected Json response body, got {0}.'.format(response.json())) - if not (type(response.json()) is list): - pytest.fail('Expected list, got {0}.'.format(response.json())) - assert response.json()[0]["ActivityCode"] == "360" - assert response.json()[0]["ActivityDescription"] == "360.gordon.edu" - assert response.json()[0]["ActivityImagePath"] == "https://360api.gordon.edu/browseable/uploads/Default/activityImage.png" - assert response.json()[0]["ActivityBlurb"] == "" - assert response.json()[0]["ActivityURL"] == "" - assert response.json()[0]["ActivityType"] == "STU" - assert response.json()[0]["ActivityTypeDescription"] == "Student Life" - assert response.json()[0]["Privacy"] == None - assert response.json()[0]["ActivityJoinInfo"] == "" - -# Verify that an activity leader can get all activity types for specific session in a list -# Endpoint -- api/activities/session/{sessionCode}/types -# Expected Status Code -- 200 OK -# Expected Response Body -- list of activities - def test_get_activities_for_session___activity_leader(self): - self.session = self.createAuthorizedSession(leader_username, leader_password) - self.url = hostURL + 'api/activities/session/201809/types/' - self.sessionID = -1 - - response = api.get(self.session, self.url) - if not response.status_code == 200: - pytest.fail('Expected 200 OK, got {0}.'.format(response.json())) - try: - response.json() - except ValueError: - pytest.fail('Expected Json response body, got {0}.'.format(response.json())) - if not (type(response.json()) is list): - pytest.fail('Expected list, got {0}.'.format(response.json())) - assert "Student Club" == response.json()[0] - assert "Scholarship" == response.json()[0] - assert "Service Learning Project" == response.json()[0] - assert "Student Ministry" == response.json()[0] - assert "Athletic Club" == response.json()[0] - assert "Leadership Program" == response.json()[0] - assert "Music Group" == response.json()[0] - assert "Residence Life" == response.json()[0] - assert "Student Life" == response.json()[0] - assert "Student Organization" == response.json()[0] - assert "Theatre Production" == response.json()[0] - assert "Student Media" == response.json()[0] - assert "Student Government" == response.json()[0] - -# Verify that an activity leader can get the status of activity in a session -# Endpoint -- api/activities/{sessionCode}/{id}/status -# Expected Status Code -- 200 OK -# Expected Response Body -- "closed" or "open" - def test_get_activities_for_session___activity_leader(self): - self.session = self.createAuthorizedSession(leader_username, leader_password) - self.url = hostURL + 'api/activities/201809/AJG/status/' - self.sessionID = -1 - - response = api.get(self.session, self.url) - if not response.status_code == 200: - pytest.fail('Expected 200 OK, got {0}.'.format(response.json())) - try: - response.json() - except ValueError: - pytest.fail('Expected string response body, got {0}.'.format(response.json())) - assert response.json() == "CLOSED" - -# Verify that an activity leader can get all open status activities -# Endpoint -- api/activities/open -# Expected Status Code -- 200 OK -# Expected Response Body -- "closed" or "open" - def test_get_activities_for_session___activity_leader(self): - self.session = self.createAuthorizedSession(leader_username, leader_password) - self.url = hostURL + 'api/activities/open/' - self.sessionID = -1 - - response = api.get(self.session, self.url) - if not response.status_code == 200: - pytest.fail('Expected 200 OK, got {0}.'.format(response.json())) - try: - response.json() - except ValueError: - pytest.fail('Expected string response body, got {0}.'.format(response.json())) - - -# Verify that an activity leader can get all closed status activities -# Endpoint -- api/activities/closed -# Expected Status Code -- 200 OK -# Expected Response Body -- "closed" activities - def test_get_activities_for_session___activity_leader(self): - self.session = self.createAuthorizedSession(leader_username, leader_password) - self.url = hostURL + 'api/activities/closed/' - self.sessionID = -1 - - response = api.get(self.session, self.url) - if not response.status_code == 200: - pytest.fail('Expected 200 OK, got {0}.'.format(response.json())) - try: - response.json() - except ValueError: - pytest.fail('Expected string response body, got {0}.'.format(response.json())) - -# Verify that an activity leader can get all open status activities per session -# Endpoint -- api/activities/sessioncode}/open -# Expected Status Code -- 200 OK -# Expected Response Body -- activities that are open - def test_get_open_activities_for_session___activity_leader(self): - self.session = self.createAuthorizedSession(leader_username, leader_password) - self.url = hostURL + 'api/activities/201809/open/' - self.sessionID = -1 - - response = api.get(self.session, self.url) - if not response.status_code == 200: - pytest.fail('Expected 200 OK, got {0}.'.format(response.json())) - try: - response.json() - except ValueError: - pytest.fail('Expected string response body, got {0}.'.format(response.json())) - -# Verify that an activity leader can get all closed status activities per session -# Endpoint -- api/activities/sessioncode}/closed -# Expected Status Code -- 200 OK -# Expected Response Body -- activities that are closed - def test_get_closed_activities_for_session___activity_leader(self): - self.session = self.createAuthorizedSession(leader_username, leader_password) - self.url = hostURL + 'api/activities/' + session_code + '/open/' - self.sessionID = -1 - - response = api.get(self.session, self.url) - if not response.status_code == 200: - pytest.fail('Expected 200 OK, got {0}.'.format(response.json())) - try: - response.json() - except ValueError: - pytest.fail('Expected string response body, got {0}.'.format(response.json())) - -# Verify that an activity leader can update activity information. -# Endpoints -- api/activities/:id -# Expected Status Code -- 200 Ok -# Expected Response Body -- Updated activity information - def test_update_activity___activity_leader(self): - self.session = self.createAuthorizedSession(leader_username, leader_password) - self.url = hostURL + 'api/activities/' + activity_code + '/' - self.data = { - "ACT_CDE" : activity_code, - "ACT_BLURB" : 'DOING TESTS, IGNORE', - "ACT_URL" : 'http://www.lolcats.com/' - } - - response = api.putAsJson(self.session, self.url , self.data) - if not response.status_code == 200: - pytest.fail('Expected 200 OK, got {0}.'.format(response.status_code)) - try: - response.json() - except ValueError: - pytest.fail('Expected json in response body, got {0}.'.format(response.text)) - try: - response.json()['ACT_CDE'] - except ValueError: - pytest.fail('Expected ACT_CDE in response body, got {0}.'.format(response.json())) - -class Test_allMembershipTest(testCase): - -# # # # # # # # # # # -# MEMBERSHIP TESTS # -# # # # # # # # # # # - -# Test retrieving all membership resources as a leader -# Endpoint -- memberships/ -# Expected Status code -- 200 Ok -# Expected Content -- List of all memberships - def test_get_all_memberships___activity_leader(self): - self.session = self.createAuthorizedSession(leader_username, leader_password) - self.url = hostURL + 'api/memberships/' - response = api.get(self.session, self.url) - if not response.status_code == 200: - pytest.fail('Expected 200 OK, got {0}.'.format(response.status_code)) - try: - response.json() - except ValueError: - pytest.fail('Expected Json response, got {0}.'.format(response.text)) - if not (type(response.json()) is list): - pytest.fail('Response was not a list') - assert response.json()[0]["ActivityCode"] == '360' - -# Test retrieving all membership resources as a member -# Endpoint -- memberships/ -# Expected Status code -- 401 Unauthorized - def test_get_all_memberships___regular_member(self): - self.session = self.createAuthorizedSession(username, password) - self.url = hostURL + 'api/memberships/' - response = api.get(self.session, self.url) - if not response.status_code == 401: - pytest.fail('Expected 401 Unauthorized, got {0}.'.format(response.status_code)) - - -# Retrieve a specific membership resource as a leader -# Endpoint -- api/memberships/:id -# Expected Status Code -- 200 OK -# Expected Content -- A Json Object with a MembershipID attribute. - def test_get_one_membership___activity_leader(self): - self.session = self.createAuthorizedSession(leader_username, leader_password) - self.url = hostURL + 'api/memberships/' - self.membershipID = -1 - # Find a valid membership id - response = api.get(self.session, self.url) - if not response.status_code == 200: - pytest.fail('Error in setup for {0}. Expected 200 OK, got {1}.'.format(self.test_name, response.status_code)) - try: - response.json() - except ValueError: - pytest.fail('Error in setup for {0}. Expected json response body, got {1}.'.format(self.test_name, response.text)) - try: - self.IDNumber = response.json()[0]['IDNumber'] - #pytest.fail(response.json()[0]['MembershipID']) - self.url = self.url + 'student/' + str(self.IDNumber) - except KeyError: - pytest.fail('Error in setup for {0}. Expected MembershipID in response body, got {1}.'.format(self.test_name, self.response.json())) - response = api.get(self.session, self.url) - if not response.status_code == 200: - pytest.fail('Expected 200 OK, got {0}.'.format(response.status_code)) - try: - response.json() - except ValueError: - pytest.fail('Expected Json response body, got {0}.'.format(response.text)) - -# Verify that a leader can fetch memberships for an activity. -# Endpoint -- api/memberships/activity/{activityId} -# Expected Status Code -- 200 OK -# Expected Response Content -- A list of json Objects. - def test_get_memberships_for_an_activity___activity_leader(self): - self.session = self.createAuthorizedSession(leader_username, leader_password) - self.url = hostURL + 'api/memberships/activity/' + activity_code + '/' - response = api.get(self.session, self.url) - if not response.status_code == 200: - pytest.fail('Expected 200 OK, got {0}.'.format(response.status_code)) - try: - response.json() - except ValueError: - pytest.fail('Expected Json response body, got {0}.'.format(response.text)) - if not (type(response.json()) is list): - pytest.fail('Response was not a list.') - assert response.json()[0]["ActivityCode"] == activity_code - if "IDNumber" in response.json(): - pytest.fail("Security faults") - assert "IDNumber" not in response.json() - -# Verify that a member can't fetch memberships for an activity. -# Endpoint -- api/memberships/activity/{activityId} -# Expected Status Code -- 200 OK -# Expected Response Content -- A list of json Objects. - def test_get_memberships_for_an_activity___regular_member(self): - self.session = self.createAuthorizedSession(username, password) - self.url = hostURL + 'api/memberships/activity/' + activity_code + '/' - response = api.get(self.session, self.url) - if not response.status_code == 401: - warnings.warn("Security fault") - pytest.fail('Expected 200 OK, got {0}.'.format(response.status_code)) - -# Verify that a member can get all group admins -# Endpoint -- api/memberships/activity/{activityId}/group-admin -# Expected Status Code -- 200 OK -# Expected Response Content -- A list of json Objects. - def test_get_memberships_for_an_activity___regular_member(self): - self.session = self.createAuthorizedSession(username, password) - self.url = hostURL + 'api/memberships/activity/' + activity_code + '/group-admin/' - response = api.get(self.session, self.url) - if not response.status_code == 200: - pytest.fail('Expected 200 OK, got {0}.'.format(response.status_code)) - try: - response.json() - except ValueError: - pytest.fail('Expected Json response body, got {0}.'.format(response.text)) - if not (type(response.json()) is list): - pytest.fail('Response was not a list.') - assert response.json()[0]["ActivityCode"] == activity_code - if "IDNumber" in response.json(): - pytest.fail("Security faults") - assert "IDNumber" not in response.json() - -# Verify that a regular member can fetch all leaders for a specific activity. -# Endpoint -- api/memberships/activity/:id/leaders -# Expected Status Code -- 200 OK -# Expected Response Content -- A list of json objects. - def test_get_leader_memberships_for_an_activity___regular_member(self): - self.session = self.createAuthorizedSession(username, password) - self.url = hostURL + 'api/memberships/activity/' + activity_code + '/leaders/' - response = api.get(self.session, self.url) - if not response.status_code == 200: - pytest.fail('Expected 200 OK, got {0}.'.format(response.status_code)) - try: - response.json() - assert response.json()[0]['Participation'] == "LEAD" - assert "IDNumber" not in response.json() - except ValueError: - pytest.fail('Expected Json response body, got {0}.'.format(response.text)) - if not (type(response.json()) is list): - pytest.fail('Response was not a list.') - -# Verify that a regular member can fetch all advisors for a specific activity. -# Endpoint -- api/memberships/activity/:id/advisors -# Expected Status Code -- 200 OK -# Expected Response Content -- A list of json objects. - def test_get_leader_memberships_for_an_activity___regular_member(self): - self.session = self.createAuthorizedSession(username, password) - self.url = hostURL + 'api/memberships/activity/' + activity_code + '/advisors/' - response = api.get(self.session, self.url) - if not response.status_code == 200: - pytest.fail('Expected 200 OK, got {0}.'.format(response.status_code)) - try: - response.json() - except ValueError: - pytest.fail('Expected Json response body, got {0}.'.format(response.text)) - if not (type(response.json()) is list): - pytest.fail('Response was not a list.') - if "IDNumber" in response.json(): - pytest.fail("Security faults") - assert "IDNumber" not in response.json() - -# Verify that a regular member can fetch number of followers for a specific activity. -# Endpoint -- api/memberships/activity/:id/advisors -# Expected Status Code -- 200 OK -# Expected Response Content -- A list of json objects. - def test_get_leader_memberships_for_an_activity___regular_member(self): - self.session = self.createAuthorizedSession(username, password) - self.url = hostURL + 'api/memberships/activity/' + activity_code + '/followers/' - response = api.get(self.session, self.url) - if not response.status_code == 200: - pytest.fail('Expected 200 OK, got {0}.'.format(response.status_code)) - try: - response.json() - except ValueError: - pytest.fail('Expected Json response body, got {0}.'.format(response.text)) - -# Verify that a regular member can fetch number of followers for a specific activity in a given session -# Endpoint -- api/memberships/activity/:id/advisors -# Expected Status Code -- 200 OK -# Expected Response Content -- A list of json objects. - def test_get_leader_memberships_for_an_activity___regular_member(self): - self.session = self.createAuthorizedSession(username, password) - self.url = hostURL + 'api/memberships/activity/AJG/followers/201809/' - response = api.get(self.session, self.url) - if not response.status_code == 200: - pytest.fail('Expected 200 OK, got {0}.'.format(response.status_code)) - try: - response.json() - except ValueError: - pytest.fail('Expected Json response body, got {0}.'.format(response.text)) - assert response.json() == 0 - -# Verify that a regular member can fetch number of members for a specific activity in a given session -# Endpoint -- api/memberships/activity/:id/advisors -# Expected Status Code -- 200 OK -# Expected Response Content -- A list of json objects. - def test_get_leader_memberships_for_an_activity___regular_member(self): - self.session = self.createAuthorizedSession(username, password) - self.url = hostURL + 'api/memberships/activity/AJG/members/201809/' - response = api.get(self.session, self.url) - if not response.status_code == 200: - pytest.fail('Expected 200 OK, got {0}.'.format(response.status_code)) - try: - response.json() - except ValueError: - pytest.fail('Expected Json response body, got {0}.'.format(response.text)) - assert response.json() == 2 - -# Verify that a regular member can fetch number of members for a specific activity. -# Endpoint -- api/memberships/activity/:id/members -# Expected Status Code -- 200 OK -# Expected Response Content -- A list of json objects. - def test_get_leader_memberships_for_an_activity___regular_member(self): - self.session = self.createAuthorizedSession(username, password) - self.url = hostURL + 'api/memberships/activity/' + activity_code + '/members/' - response = api.get(self.session, self.url) - if not response.status_code == 200: - pytest.fail('Expected 200 OK, got {0}.'.format(response.status_code)) - try: - response.json() - except ValueError: - pytest.fail('Expected Json response body, got {0}.'.format(response.text)) - -# Verify that a leader can fetch memberships associated with them. -# Endpoints -- api/memberships/student/:id -# Expected Status Code -- 200 OK -# Expected Reponse Content -- A list of json objects - def test_get_all_my_memberships___activity_leader(self): - self.session = self.createAuthorizedSession(leader_username, leader_password) - self.url = hostURL + 'api/memberships/student/' + str(my_id_number) + '/' - response = api.get(self.session, self.url) - if not response.status_code == 200: - pytest.fail('Expected 200 OK, got {0}.'.format(response.status_code)) - try: - response.json() - except ValueError: - pytest.fail('Expected Json response body, got {0}.'.format(response.text)) - if not (type(response.json()) is list): - pytest.fail('Response was not a list.') - warnings.warn("Security faults") - assert my_id_number == response.json()[0]["IDNumber"] - -# Verify that a member can fetch memberships based on username -# Endpoints -- api/memberships/student/:id -# Expected Status Code -- 200 OK -# Expected Reponse Content -- A list of json objects - def test_get_all_my_memberships___activity_leader(self): - self.session = self.createAuthorizedSession(leader_username, leader_password) - self.url = hostURL + 'api/memberships/student/username/' + username + '/' - response = api.get(self.session, self.url) - if not response.status_code == 200: - pytest.fail('Expected 200 OK, got {0}.'.format(response.status_code)) - try: - response.json() - except ValueError: - pytest.fail('Expected Json response body, got {0}.'.format(response.text)) - if not (type(response.json()) is list): - pytest.fail('Response was not a list.') - warnings.warn("Security faults") - assert my_id_number == response.json()[0]["IDNumber"] - -# Verify that leader can fetch someone else's memberships. -# Endpoint -- api/memberships/student/:id -# Expected Status Code -- 200 OK. -# Expected Response Content -- A list of json objects. - def test_get_all_memberships_for_someone_else___activity_leader(self): - self.session = self.createAuthorizedSession(leader_username, leader_password) - self.url = hostURL + 'api/memberships/student/' + str(valid_id_number) - response = api.get(self.session, self.url) - if not response.status_code == 200: - pytest.fail('Expected 200 OK, got {0}.'.format(response.status_code)) - try: - response.json() - except ValueError: - pytest.fail('Expected Json response body, got {0}.'.format(response.text)) - if not (type(response.json()) is list): - pytest.fail('Response was not a list') - warnings.warn("Security fault") - -# Verify that an activity leader can create a Guest membership for someone. -# Endpoints -- api/memberships/ -# Expected Statis Cpde -- 201 Created. -# Expected Content -- A Json object with a MEMBERSHIP_ID attribute. - def test_post_new_guest_membership_for_someone_else__activity_leader(self): - self.session = self.createAuthorizedSession(leader_username, leader_password) - - self.url = hostURL + 'api/memberships/' - self.data = { - 'ACT_CDE': activity_code, - 'SESS_CDE' : session_code, - 'ID_NUM': valid_id_number, - 'PART_CDE':'GUEST', - 'BEGIN_DTE':'06/10/2016', - 'END_DTE':'07/16/2016', - 'COMMENT_TXT':comments - } - # We will get the actual id when we post. - # Setting it -1 to check later that we got an id from the post. - self.createdMembershipID = -1 - - response = api.postAsJson(self.session, self.url, self.data) - if response.status_code == 201: - if not ('MEMBERSHIP_ID' in response.json()): - pytest.fail('Expected MEMBERSHIP_ID in json response, got {0}.'.format(response.json())) - else: - self.createdMembershipID = response.json()['MEMBERSHIP_ID'] - else: - pytest.fail('Expected 201 Created, got {0}.'.format(response.status_code)) - try: - response.json() - except ValueError: - pytest.fail('Expected Json response body, got {0}.'.format(response.text)) - assert response.json()['PART_CDE'] =='GUEST' - api.delete(self.session, self.url + str(self.createdMembershipID)) - - -# Verify that an activity leader can create a membership for someone. -# Endpoint -- api/memberships/ -# Expected Status Code -- 200 OK -# Expected Content -- A json response with the created membership - def test_post_new_membership_for_someone___activity_leader(self): - self.session = self.createAuthorizedSession(leader_username, leader_password) - self.url = hostURL + 'api/memberships/' - self.createdMembershipID = -1 - # Add a new participant - self.data = { - 'ACT_CDE': activity_code, - 'SESS_CDE' : session_code, - 'ID_NUM': valid_id_number, - 'PART_CDE':'MEMBR', - 'BEGIN_DTE':'06/10/2016', - 'END_DTE':'07/16/2016', - 'COMMENT_TXT': comments - } - - response = api.postAsJson(self.session, self.url, self.data) - if not response.status_code == 201: - pytest.fail('Expected 201 Created, got {0}.'.format(response.status_code)) - try: - response.json() - except ValueError: - pytest.fail('Expected Json response body, got {0}.'.format(response.text)) - try: - self.createdMembershipID = response.json()['MEMBERSHIP_ID'] - except KeyError: - pytest.fail('Expected MEMBERSHIP ID in response, got {0}.'.format(response.json())) - - #checking if the correctness of post - getResponse = api.get(self.session, hostURL + 'api/memberships/activity/' + str(activity_code)) - self.membershipID = response.json()['MEMBERSHIP_ID'] - req = getResponse.json() - found = False - for dic in req: - reqID = dic['MembershipID'] - if (reqID == self.membershipID): - found = True - try: - assert dic['ActivityCode'] == activity_code - assert dic['SessionCode'] == session_code - assert dic['IDNumber'] == valid_id_number - except ValueError: - pytest.fail('Expected Json response body, got{0}.'.format(getResponse.json)) - if not found: - pytest.fail('requestID not found:', self.requestID) - - if self.createdMembershipID >= 0: - api.delete(self.session, self.url + str(self.createdMembershipID)) - -# Verify that an activity leader can assign a new leader -# Endpoint -- api/memberships/ -# Expected Status Code -- 200 OK -# Expected Content -- A json response with the created membership - def test_post_new_leader_membership_for_someone___activity_leader(self): - self.session = self.createAuthorizedSession(leader_username, leader_password) - self.url = hostURL + 'api/memberships/' - self.createdMembershipID = -1 - # Add a new leader - self.data = { - 'ACT_CDE': activity_code, - 'SESS_CDE':session_code, - 'ID_NUM': valid_id_number, - 'PART_CDE':'LEAD', - 'BEGIN_DTE':begin_date, - 'END_DTE':end_date, - 'COMMENT_TXT':comments - } - response = api.postAsJson(self.session, self.url, self.data) - if not response.status_code == 201: - pytest.fail('Expected 201, got {0}.'.format(response.status_code)) - try: - response.json() - except ValueError: - pytest.fail('Expected Json response body, got {0}.'.format(response.text)) - try: - self.createdMembershipID = response.json()['MEMBERSHIP_ID'] - if self.createdMembershipID < 0: # The creation was not successful - pytest.fail('Expected valid memberhsip ID, got {0}.'.format(self.createdMembershipID)) - else: - #checking if the correctness of post - getResponse = api.get(self.session, hostURL + 'api/memberships/activity/' + str(activity_code)) - self.membershipID = response.json()['MEMBERSHIP_ID'] - req = getResponse.json() - found = False - for dic in req: - reqID = dic['MembershipID'] - if (reqID == self.membershipID): - found = True - try: - assert dic['ActivityCode'] == activity_code - assert dic['SessionCode'] == session_code - assert dic['IDNumber'] == valid_id_number - except ValueError: - pytest.fail('Expected Json response body, got{0}.'.format(getResponse.json)) - if not found: - pytest.fail('MembershipID not found:', self.membershipID) - d = api.delete(self.session, self.url + str(self.createdMembershipID)) - if not d.status_code == 200: - pytest.fail('Error in cleanup. Expected , got {0}.'.format(d.status_code)) - except KeyError: - pytest.fail('Expected MEMBERSHIP ID in response, got {0}.'.format(response.json())) - - - -# Verify that an activity leader can upgrade a normal membership to leader status. -# Endpoint -- api/memberships/:id -# Expected Status Code -- 200 OK -# Expected Content -- A json object with a MEMBERSHIP_ID attribute. - def test_put_edited_membership_member_to_leader___activity_leader(self): - self.session = self.createAuthorizedSession(leader_username, leader_password) - self.url = hostURL + 'api/memberships/' - self.createdMembershipID = -1 - - # The membership to modify - self.predata = { - 'ACT_CDE': activity_code, - 'SESS_CDE' : session_code, - 'ID_NUM': valid_id_number, - 'PART_CDE':'MEMBR', # Is a participant at first. - 'BEGIN_DTE':'06/10/2016', # Old start date - 'END_DTE':'07/16/2016', - 'COMMENT_TXT':comments - } - r = api.postAsJson(self.session, self.url, self.predata) - try: - self.createdMembershipID = r.json()["MEMBERSHIP_ID"] - # Updated Data - self.data = { - 'MEMBERSHIP_ID' : self.createdMembershipID, - 'ACT_CDE': activity_code, - 'SESS_CDE' : session_code, - 'ID_NUM': valid_id_number, - 'PART_CDE':'LEAD', # Upgrade him to director. - 'BEGIN_DTE':'02/10/2016', # New start date - 'END_DTE':'07/16/2016', - 'COMMENT_TXT':comments - } - except (KeyError, ValueError): - pytest.fail('Error in setup.') - response = api.putAsJson(self.session, self.url + str(self.createdMembershipID), self.data) - if not response.status_code == 200: - pytest.fail('Expected 200 OK, got {0}.'.format(response.status_code)) - try: - response.json() - except ValueError: - pytest.fail('Expected Json response body, got {0}.'.format(response.text)) - try: - self.createdMembershipID = response.json()['MEMBERSHIP_ID'] - except KeyError: - pytest.fail('Expected MEMBERSHIP_ID in json response, got {0}.'.format(response.json())) - assert response.json()['PART_CDE'] == 'LEAD' - if self.createdMembershipID >= 0: - api.delete(self.session, self.url + str(self.createdMembershipID)) - -# Verify that an activity leader can demote a leader membership. -# Endpoint -- api/memberships/:id -# Expected Status Code -- 200 OK -# Expected Content -- A json object with a MEMBERSHIP_ID attribute. - - def test_put_edited_membership_leader_to_member___activity_leader(self): - self.session = self.createAuthorizedSession(leader_username, leader_password) - self.url = hostURL + 'api/memberships/' - self.createdMembershipID = -1 - # The membership to modify - self.predata = { - 'ACT_CDE': activity_code, - 'SESS_CDE' : session_code, - 'ID_NUM': valid_id_number, - 'PART_CDE':'LEAD', # Is a leader at first - 'BEGIN_DTE':'06/10/2016', # Old start date - 'END_DTE':'07/16/2016', - 'COMMENT_TXT':comments - } - r = api.postAsJson(self.session, self.url, self.predata) - try: - self.createdMembershipID = r.json()["MEMBERSHIP_ID"] - # Updated Data - self.data = { - 'MEMBERSHIP_ID' : self.createdMembershipID, - 'ACT_CDE': activity_code, - 'SESS_CDE' : session_code, - 'ID_NUM': valid_id_number, - 'PART_CDE':'MEMBR', # Demote him to member - 'BEGIN_DTE':'02/10/2016', # New start date - 'END_DTE':'07/16/2016', - 'COMMENT_TXT':comments - } - except (KeyError, ValueError): - pytest.fail('Error in setup.') - response = api.putAsJson(self.session, self.url + str(self.createdMembershipID), self.data) - if not response.status_code == 200: - pytest.fail('Expected 200 OK, got {0}.'.format(response.status_code)) - try: - response.json() - except ValueError: - pytest.fail('Expected Json response body, got {0}.'.format(response.text)) - try: - self.createdMembershipID = response.json()['MEMBERSHIP_ID'] - except KeyError: - pytest.fail('Expected MEMBERSHIP_ID in json response, got {0}.'.format(response.json())) - assert response.json()['PART_CDE'] == 'MEMBR' - if self.createdMembershipID >= 0: - api.delete(self.session, self.url + str(self.createdMembershipID)) - -# Verify that an activity leader can delete someone else's membership. -# Endpoint -- api/memberships/ -# Expected Status Code -- 200 OK -# Expected Response Content -- The membership resource that wad delteed. - def test_delete_valid_membership___activity_leader(self): - self.session = self.createAuthorizedSession(leader_username, leader_password) - self.url = hostURL + 'api/memberships/' - self.createdMembershipID = -1 - - # Create a Memerships that we'll eventually delete - self.predata = { - 'ACT_CDE': activity_code, - 'SESS_CDE' : session_code, - 'ID_NUM': valid_id_number, - 'PART_CDE':'MEMBR', - 'BEGIN_DTE':begin_date, - 'END_DTE':end_date, - 'COMMENT_TXT':comments - } - r = api.postAsJson(self.session, self.url, self.predata) - try: - self.createdMembershipID = r.json()['MEMBERSHIP_ID'] - except (ValueError, KeyError): - pytest.fail('Error doing setup') - response = api.delete(self.session, self.url + str(self.createdMembershipID)) - if not response.status_code == 200: - pytest.fail('Expected 200 OK, got {0}.'.format(response.status_code)) - try: - response.json() - except ValueError: - pytest.fail('Expected Json response body, got {0}.'.format(response.text)) - if not ('MEMBERSHIP_ID' in response.json()): - pytest.fail('Expected MEMBERSHIP_ID in response, got {0}.'.format(response.json())) - -class Test_allMembershipRequestTest(testCase): - - -# # # # # # # # # # # # # # -# MEMBERSHIP REQUEST TEST # -# # # # # # # # # # # # # # - -# Verify that a regular member cannot access all membership requests. -# Endpoint -- api/requests/ -# Expected Status Code -- 401 Unauthorized -# Expected Response Content -- Empty response content. - - - def test_not_get_all_membership_requests(self): - - self.session = self.createAuthorizedSession(username, password) - self.url = hostURL + 'api/requests/' - response = api.get(self.session, self.url) - if not response.status_code == 401: - pytest.fail('Expected 401 Unauthorized, got {0}.'.format(response.status_code)) - if response.text: - pytest.fail('Expected empty response body, got {0}.'.format(response.text)) - -# Verify that a regular member cannot get the membership requests of somone else. -# Endpoint -- api/requests/student/:id -# Expected Status Code -- 404 Not Found -# Expected Response Body -- Empty - def test_not_get_membership_requests_for_someone_else(self): - self.session = self.createAuthorizedSession(username, password) - self.url = hostURL + 'api/requests/student/' + str(valid_id_number) - response = api.get(self.session, self.url) - if not response.status_code == 404: - pytest.fail('Expected 404 Not Found, got {0}.'.format(response.status_code)) - -# Verify that a regular member can't access memberships requests for activity. -# Endpoint -- api/requests/activity/:id -# Expected Status Code -- 401 Unauthorized -# Expected Response Body -- Empty - -# Passed with activity code 'TRAS', but not AJG because studenttest is a leader for AJG - def test_not_get_membership_requests_for_activity(self): - self.session = self.createAuthorizedSession(username, password) - self.url = hostURL + 'api/requests/activity/' + 'TRAS' - # Report if there any current memberships for the Club to avoid false negatives. - # If I am currently a director of the club, this test should fail. - response = api.get(self.session, hostURL + 'api/memberships/student/' + str(my_id_number)) - try: - for membership in response.json(): - if(membership['ActivityCode'] == activity_code and membership['Participation'] in LEADERSHIP_POSITIONS): - pytest.fail('False Negative: This user is a leader for the activity we are testing.') - except ValueError: - pytest.fail('We did not get a json response back during setup.') - - response = api.get(self.session, self.url) - if not response.status_code == 401: - pytest.fail('We did not get 401 Unauthorized.') - if response.text: - pytest.fail('We got a non-empty response body.') - -# Verify that we can create a membership request. -# Endpoints -- api/requests/ -# Expected Status Cpde -- 201 Created. -# Expected Content -- A Json object with a REQUEST_ID attribute. - -# session code 201510 does not work - def test_post_valid_membership_request__as_member(self): - self.session = self.createAuthorizedSession(username, password) - self.url = hostURL + 'api/requests/' - self.data = { - 'ACT_CDE': activity_code, - 'SESS_CDE' : session_code, - 'ID_NUM': my_id_number, - 'PART_CDE':'MEMBR', - 'DATE_SENT' : '06/27/2019', - 'COMMENT_TXT':comments - } - # We will get the actual id when we post. - # Setting it -1 to check later that we got an id from the post. - self.requestID = -1 - response = api.postAsJson(self.session, self.url, self.data) - if not response.status_code == 201: - pytest.fail('Expected 201 Created, got {0}.'.format(response.status_code)) - try: - response.json() - except ValueError: - pytest.fail('Expected json response, got {0}.'.format(response.text)) - - #checking if the correctness of post\ - self.session = self.createAuthorizedSession(leader_username, leader_password) - getResponse = api.get(self.session, hostURL + 'api/requests/activity/' + str(activity_code)) - self.requestID = response.json()['REQUEST_ID'] - req = getResponse.json() - found = False - for dic in req: - reqID = dic['RequestID'] - if (reqID == self.requestID): - found = True - try: - assert dic['ActivityCode'] == activity_code - assert dic['SessionCode'] == session_code - assert dic['IDNumber'] == my_id_number - except ValueError: - pytest.fail('Expected Json response body, got{0}.'.format(response1.json)) - if not found: - pytest.fail('requestID not found:', self.requestID) - - #delete the test post - try: - self.requestID = response.json()['REQUEST_ID'] - print(self.requestID) - if self.requestID >= 0: - api.delete(self.session, self.url + str(self.requestID)) - except KeyError: - pytest.fail('Expected REQUEST_ID in response body, got {0}.'.format(response.json())) - - - -# Verify that we can't create a membership request for someone else as a member. -# Endpoints -- api/requests/ -# Expected Status Code -- 401 Unauthorized. -# Expected Response Content -- Empty Response. -# look up for configuration.py for the data configuration - - def test_not_post_membership_request_for_someone_else(self): - self.session = self.createAuthorizedSession(username, password) - self.url = hostURL + 'api/requests/' - self.data = { - 'ACT_CDE': activity_code, - 'SESS_CDE' : session_code, - 'ID_NUM': valid_id_number, - 'PART_CDE': member_positions, - 'DATE_SENT' : '07/06/2016', - 'COMMENT_TXT': comments - } - # We will get the actual id when we post. - self.requestID = -1 - response = api.post(self.session, self.url, self.data) - - if response.status_code == 201: - try: - self.requestID = response.json()['REQUEST_ID'] - if self.requestID >= 0: - api.delete(self.session, self.url + str(self.requestID)) - pytest.fail('Request {0} was created even though it was supposed to be unauthorized'.format(self.requestID)) - except (ValueError, KeyError): - pytest.fail('Error in test') - elif not response.status_code == 401: - pytest.fail('Expected 401 Unauthorized, got {0}.'.format(response.status_code)) - - -# Verify that an activity leader can access all membership requests. -# Endpoint -- api/requests/ -# Expected Status Code -- 200 OK -# Expected Response Content -- List of json objects representing the membership requests for all. - - def test_get_all_membership_requests(self): - self.session = self.createAuthorizedSession(leader_username, leader_password) - self.url = hostURL + 'api/requests/' - response = api.get(self.session, self.url) - if not response.status_code == 200: - pytest.fail('Expected 200 OK, got {0}.'.format(response.status_code)) - try: - assert response.json()[0]['ActivityCode'] == "BADM" - assert response.json()[1]['ActivityCode'] == "ACS" - assert response.json()[2]['ActivityCode'] == "SCOTTIE" - except ValueError: - pytest.fail('Expected Json response body, got {0}.'.format(response.text)) - if not (type(response.json()) is list): - pytest.fail('Expected list in response body, got {0}.'.format(response.json())) - -# Verify that the activity leader can get requests to join the activity he/she is leading -# Endpoint -- api/requests/activity/:id -# Expected Status Code -- 200 OK -# Expected Response Body -- List of json objects representing the membership requests for an activity. - - def test_get_membership_requests_for_activity(self): - self.session = self.createAuthorizedSession(leader_username, leader_password) - self.url = hostURL + 'api/requests/activity/' + activity_code + '/' - response = api.get(self.session, self.url) - if not response.status_code == 200: - pytest.fail('Expected 200 OK, got {0}.'.format(response.status_code)) - try: - assert response.json()[0]['ActivityCode'] == activity_code - except ValueError: - pytest.fail('Expected Json response body, got {0}.'.format(response.text)) - if not (type(response.json()) is list): - pytest.fail('Expected list in response body, got {0}.'.format(response.json())) - -# Verify that an activity leader cannot get the membership requests of someone else. -# Endpoint -- api/requests/student/:id -# Expected Status Code -- 404 Not Found -# Expected Response Body -- Empty - - def test_get_membership_requests_for_someone_else___activity_leader(self): - self.session = self.createAuthorizedSession(leader_username, leader_password) - self.url = hostURL + 'api/requests/student/' + str(valid_id_number) - response = api.get(self.session, self.url) - if not response.status_code == 404: - pytest.fail('Expected 404 Not Found, got {0}.'.format(response.status_code)) - - -# Verify that we can create a membership request as leader. -# Endpoints -- api/requests/ -# Expected Status Cpde -- 201 Created. -# Expected Content -- A Json object with a REQUEST_ID attribute. - - def test_post_valid_membership_request__as_leader(self): - self.session = self.createAuthorizedSession(leader_username, leader_password) - self.url = hostURL + 'api/requests/' - self.data = { - 'ACT_CDE': activity_code, - 'SESS_CDE' : session_code, - 'ID_NUM': my_id_number, - 'PART_CDE':'MEMBR', - 'DATE_SENT' : '07/06/2016', - 'COMMENT_TXT':comments - } - # We will get the actual id when we post. - # Setting it -1 to check later that we got an id from the post. - self.requestID = -1 - - response = api.postAsJson(self.session, self.url, self.data) - if not response.status_code == 201: - pytest.fail('Expected 201 Created, got {0}.'.format(response.status_code)) - try: - response.json() - except ValueError: - pytest.fail('Expected json response, got {0}.'.format(response.text)) - - #checking if the correctness of post\ - self.session = self.createAuthorizedSession(leader_username, leader_password) - getResponse = api.get(self.session, hostURL + 'api/requests/activity/' + str(activity_code)) - self.requestID = response.json()['REQUEST_ID'] - req = getResponse.json() - found = False - for dic in req: - reqID = dic['RequestID'] - if (reqID == self.requestID): - found = True - try: - assert dic['ActivityCode'] == activity_code - assert dic['SessionCode'] == session_code - assert dic['IDNumber'] == my_id_number - except ValueError: - pytest.fail('Expected Json response body, got{0}.'.format(response1.json)) - if not found: - pytest.fail('requestID not found:', self.requestID) - - #try: - # self.requestID = response.json()['REQUEST_ID'] - # if not response.json()['STATUS'] == REQUEST_STATUS_PENDING: - # pytest.fail('Expected Pending status , got {0}.'.format(resposne.json())) - #except KeyError: - # pytest.fail('Expected REQUEST_ID in response body, got {0}.'.format(response.json())) - - # We try to delete the request we created - if self.requestID >= 0: - api.delete(self.session, self.url + str(self.requestID)) - -# Verify that we can create a membership request for someone else as leader. -# Endpoints -- api/requests/ -# Expected Status Code -- 401 Unauthorized. -# Expected Response Content -- Empty Response. - def test_post_membership_request_for_someone_else(self): - self.session = self.createAuthorizedSession(leader_username, leader_password) - self.url = hostURL + 'api/requests/' - self.data = { - 'ACT_CDE': activity_code, - 'SESS_CDE' : session_code, - 'ID_NUM': valid_id_number, - 'PART_CDE':'MEMBR', - 'DATE_SENT' : '07/06/2016', - 'COMMENT_TXT':comments - } - # We will get the actual id when we post. - self.requestID = -1 - response = api.post(self.session, self.url, self.data) - if response.status_code == 201: - try: - self.requestID = response.json()['REQUEST_ID'] - except (ValueError, KeyError): - pytest.fail('Error in test') - - #checking if the correctness of post\ - self.session = self.createAuthorizedSession(leader_username, leader_password) - getResponse = api.get(self.session, hostURL + 'api/requests/activity/' + str(activity_code)) - self.requestID = response.json()['REQUEST_ID'] - req = getResponse.json() - found = False - for dic in req: - reqID = dic['RequestID'] - if (reqID == self.requestID): - found = True - try: - assert dic['ActivityCode'] == activity_code - assert dic['SessionCode'] == session_code - assert dic['IDNumber'] == valid_id_number - except ValueError: - pytest.fail('Expected Json response body, got{0}.'.format(response1.json)) - if not found: - pytest.fail('requestID not found:', self.requestID) - - - #delete the test post - d = api.delete(self.session, self.url + str(self.requestID)) - if d.status_code != 200: - pytest.fail('Unauthorized resource not deleted.') - - - -# Verify that an activity leader can't edit a membership request through a put request. -# Pre-Conditions: -# Valid Authorization Header. -# Authenticated as activity leader. -# Expectations: -# Endpoint -- api/requests/:id -# Expected Status Code -- 401 Unauthorized -# Expected Response Body -- Empty -# -# def test_put_membership_request___activity_leader(self): -# self.session = self.createAuthorizedSession(leader_username, leader_password) -# self.url = hostURL + '/api/requests/' -# self.requestID = -1 -# -# self.predata = { -# 'ACT_CDE': activity_code, -# 'SESS_CDE' : session_code, -# 'ID_NUM': my_id_number, -# 'PART_CDE':'MEMBR', -# 'DATE_SENT' : '07/06/2016', -# 'COMMENT_TXT':comments -# } -# response = api.postAsJson(self.session, self.url, self.predata) -# try: -# self.requestID = response.json()['REQUEST_ID'] -# self.data = { -# 'REQUEST_ID': self.requestID, -# 'ACT_CDE': activity_code, -# 'SESS_CDE' : '201501', -# 'ID_NUM': valid_id_number, #Changing values to emulate attacker muhahah -# 'PART_CDE':'PART', -# 'DATE_SENT' : '07/06/2016', -# 'COMMENT_TXT':comments -# } -# except ValueError: -# pytest.fail('Error performing setup') -# -# response = api.putAsJson(self.session, self.url + str(self.requestID), self.data) -# if not response.status_code == 401: -# pytest.fail('Expected 401 Unauthorized, got {0}.'.format(response.status_code)) -# if response.text: -# pytest.fail('Expected empty response body, got {0}.'.format(response.text)) -# api.delete(self.session, self.url + str(self.requestID)) - - -# Verify that an activity leader can delete a membership request for his activity -# Endpoints -- api/requests/:id -# Expected Status Code -- 200 OK -# Expected Response Body -- The request that was deleted - def test_delete_membership_request(self): - self.session = self.createAuthorizedSession(leader_username, leader_password) - self.url = hostURL + 'api/requests/' - self.predata = {} - self.requestID = -1 - - self.predata = { - 'ACT_CDE': activity_code, - 'SESS_CDE': session_code, - 'PART_CDE': 'MEMBR', - 'ID_NUM': leader_id_number, - 'DATE_SENT': '07/19/2016', - 'COMMENT_TXT':comments - } - response = api.postAsJson(self.session, self.url, self.predata) - if not response.status_code == 201: - pytest.fail('Error in setup. Expected 201 Created, got {0}.'.format(response.status_code)) - else: - self.requestID = response.json()['REQUEST_ID'] - response = api.delete(self.session, self.url + '/' + str(self.requestID)) - if not response.status_code == 200: - pytest.fail('Expected 200 OK, got {0}.'.format(response.status_code)) - try: - response.json() - except ValueError: - pytest.fail('Expected Json response body, got {0}.'.format(response.text)) - try: - response.json()['REQUEST_ID'] - except KeyError: - pytest.fail('Expected REQUEST_ID in response body, got {0}.'.format(response.json())) - -# Verify that the activity leader can accept a request directed at their activity. -# Endpoints -- api/requests/:id/approve -# Expected Status Code -- 200 OK -# Expected Response Body -- Json response with the request that was accepted. - def test_allow_someone_to_join_my_activity___activity_leader(self): - self.session = self.createAuthorizedSession(leader_username, leader_password) - self.url = hostURL + 'api/requests/' - self.requestID = -1 - self.membershipID = -1 - - #Create a memberships request for the trash club. - self.data = { - 'ACT_CDE': activity_code, - 'SESS_CDE' : session_code, - 'ID_NUM': my_id_number, - 'PART_CDE':'MEMBR', - 'DATE_SENT' : '07/06/2016', - 'COMMENT_TXT':comments - } - response = api.postAsJson(self.session, self.url, self.data) - if not response.status_code == 201: - pytest.fail('Error in setup. Expected 201 Created, got {0}.'.format(response.status_code)) - try: - response.json() - except ValueError: - pytest.fail('Error in setup. Expected json response, got {0}.'.format(response.text)) - try: - self.requestID = response.json()['REQUEST_ID'] - except KeyError: - pytest.fail('Error in setup. Expected REQUEST_ID in response, got {0}.'.format(response.json())) - - response = api.postAsJson(self.session, self.url + str(self.requestID) + '/approve', None) - if not response.status_code == 200: - pytest.fail('Expected 200 OK, got {0}.'.format(response.status_code)) - try: - response.json() - except ValueError: - pytest.fail('Expected Json response body, got {0}.'.format(response.text)) - try: - self.membershipID = response.json()['MEMBERSHIP_ID'] - if self.requestID < 0: - pytest.fail('Error in cleanup for {0}. Expected valid request ID, got {1}.'.format(self.test_name, self.requestID)) - else: - d = api.delete(self.session, self.url + str(self.requestID)) - if not d.status_code == 200: - pytest.fail('Error in cleanup for {0}. Expected 200 OK when deleting request, got {1}.'.format(self.test_name, d.status_code)) - if self.membershipID < 0: # membership creatino was not successful - pytest.fail('Error in cleanup. Expected valid membership ID, got {0}.'.format(self.membershipID)) - else: - api.delete(self.session, hostURL + 'api/memberships/' + str(self.membershipID)) - if not d.status_code == 200: - pytest.fail('Error in cleanup. Expected 200 OK when deleting membership, got {0}.'.format(d.status_code)) - except KeyError: - pytest.fail('Expected MEMBERSHIP_ID in response bady, got {0}.'.format(response.json())) - -# Verify that the activity leader can deny a request directed at their activity. -# Endpoints -- api/requests/:id/deny -# Expected Status Code -- 200 OK -# Expected Response Body -- Json response with the request that was denied - def test_deny_someone_joining_my_activity(self): - self.session = self.createAuthorizedSession(leader_username, leader_password) - self.url = hostURL + 'api/requests/' - self.requestID = -1 - - #Create a memberships request for the trash club. - self.data = { - 'ACT_CDE': activity_code, - 'SESS_CDE' : session_code, - 'ID_NUM': my_id_number, - 'PART_CDE':'MEMBR', - 'DATE_SENT' : '07/06/2016', - 'COMMENT_TXT':comments - } - response = api.postAsJson(self.session, self.url, self.data) - if not response.status_code == 201: - pytest.fail('Error in setup for {0}. Expected 201 Created, got {1}.'.format(self.test_name, response.status_code)) - try: - response.json() - except ValueError: - pytest.fail('Error in setup for {0}. Expected json response, got {1}.'.format(self.test_name, response.text)) - else: - try: - self.requestID = response.json()['REQUEST_ID'] - except KeyError: - pytest.fail('Error in setup. Expected REQUEST_ID in response, got {0}.'.format(response.json())) - response = api.postAsJson(self.session, self.url + str(self.requestID) + '/deny', None) - if not response.status_code == 200: - pytest.failr('Expected 200 OK, got {0}.'.format(response.status_code)) - try: - response.json() - except ValueError: - pytest.fail('Expected Json response body, got {0}.'.format(response.text)) - else: - try: - if not response.json()['STATUS'] == REQUEST_STATUS_DENIED: - pytest.fail('Expected approved request, got {0}.'.format(response.json())) - except KeyError: - pytest.fail('Expected STATUS in response bady, got {0}.'.format(response.json())) - - api.delete(self.session, self.url + str(self.requestID)) - -class Test_allProfileTest(testCase): -################# -# PROFILE TESTS # -################# - -# Verify that an user can get their own profile -# Endpoint -- api/profiles/ -# Expected Status Code -- 200 OK -# Expected Respones Body -- A json object of information on own profile - - def test_get_my_profile(self): - self.session = self.createAuthorizedSession(username, password) - self.url = hostURL + 'api/profiles/' - response = api.get(self.session, self.url) - if not response.status_code == 200: - pytest.fail('Expected 200 OK, got {0}.'.format(response.status_code)) - try: - assert response.json()['AD_Username'] == '360.StudentTest' - assert response.json()['ID'] == '999999097' - except ValueError: - pytest.fail('Expected Json response body, got {0}.'.format(response.text)) - -# Verify that an user can get another person's profile, filtering private information -# Endpoint -- api/profiles/:username -# Expected Status Code -- 200 Ok -# Expected Response Body -- list of information on the user without private info - - def test_get_profile_by_username(self): - self.session = self.createAuthorizedSession(username, password) - self.url = hostURL + 'api/profiles/' + leader_username +'/' - response = api.get(self.session, self.url) - if not response.status_code == 200: - pytest.fail('Expected 200 OK, got {0}.'.format(response.status_code)) - try: - assert response.json()['AD_Username'] == '360.FacultyTest' - assert "ID" not in response.json() - except ValueError: - pytest.fail('Expected Json response body, got{0}.'.format(response.text)) - -# Verify that an user can get a profile image of the current user -# Endpoint -- api/profiles/image -# Expected Status Code -- 200 Ok -# Expected Response Body -- image path of the current user - def test_get_image(self): - self.session = self.createAuthorizedSession(username, password) - self.url = hostURL + 'api/profiles/image/' - response = api.get(self.session, self.url) - if not response.status_code == 200: - pytest.fail('Expected 200 OK, got {0}.'.format(response.status_code)) - try: - response.json() - except ValueError: - pytest.fail('Expected Json response body, got{0}.'.format(response.text)) - -# Verify that an user can get a profile image of someone else -# Endpoint -- api/profiles/image/:username -# Expected Status Code -- 200 Ok -# Expected Response Body -- image path of another user - def test_get_image_by_username(self): - self.session = self.createAuthorizedSession(username, password) - self.url = hostURL + 'api/profiles/image/' + leader_username + '/' - response = api.get(self.session, self.url) - if not response.status_code == 200: - pytest.fail('Expected 200 OK, got {0}.'.format(response.status_code)) - try: - response.json() - except ValueError: - pytest.fail('Expected Json response body, got{0}.'.format(response.text)) - -# Verify that a user can upload a profile image -# Endpoint -- api/profiles/image/ -# Expected Status Code -- 200 OK -# Expected Content -- updated profile image - def test_post_profile_image(self): - self.session = self.createAuthorizedSession(username, password) - self.url = hostURL + 'api/profiles/image/' - self.data = { - 'ID': my_id_number, - 'FILE_PATH': "", #File path of the image on the user's computer, - 'FILE_NAME': "" #Barcode ID of the user - } - response = api.postAsFormData(self.session, self.url, self.data) - #from pprint import pprint - #pprint(response.json()['headers']) - if not response.status_code == 200: - pytest.fail('Expected 200 OK, got {0}.'.format(response.status_code)) - #self.data = { - # 'ID': my_id_number, - # 'FILE_PATH': FILE_PATH, - # 'FILE_NAME': FILE_NAME - #} - d = api.post(self.session, self.url + 'reset/', self.data) - if not d.status_code == 200: - pytest.fail('There was a problem performing cleanup') - -# Verify that a user can upload an ID image -# Endpoint -- api/profiles/IDimage/ -# Expected Status Code -- 200 OK -# Expected Content -- upload ID photo - def test_post_ID_image(self): - self.session = self.createAuthorizedSession(username, password) - self.url = hostURL + 'api/profiles/IDimage/' - self.data = { - 'ID': my_id_number, - 'FILE_PATH': FILE_PATH, #File path of the image on the user's computer, - 'FILE_NAME': "" #Barcode ID of the user - } - response = api.post(self.session, self.url, self.data) - if not response.status_code == 200: - pytest.fail('Expected 200 OK, got {0}.'.format(response.status_code)) - self.data = { - 'ID': my_id_number, - 'FILE_PATH': FILE_PATH, - 'FILE_NAME': "" - } - d = api.post(self.session, self.url + 'reset/', self.data) - if not d.status_code == 200: - pytest.fail('There was a problem performing cleanup') - -# Verify that a user can reset a profile image -# Endpoint -- api/profiles/image/reset/ -# Expected Status Code -- 200 OK -# Expected Content -- - def test_post_reset_image(self): - self.session = self.createAuthorizedSession(username, password) - self.url = hostURL + 'api/profiles/image/reset/' - self.data = { - 'ID': my_id_number, - 'FILE_PATH': FILE_PATH, - 'FILE_NAME': "" - } - self.requestID = -1 - response = api.post(self.session, self.url, self.data) - if not response.status_code == 200: - pytest.fail('Expected 200 Created, got {0}.'.format(response.status_code)) - -# Verify that a user can add and edit social media links -# Endpoint -- api/profiles/:type -# Expected Status Code -- 200 OK -# Expected Content -- - def test_put_social_media_links(self): - self.session = self.createAuthorizedSession(username, password) - self.url = hostURL + 'api/profiles/facebook/' - self.data = { - 'facebook': 'https://www.facebook.com/360.studenttest' #'URL of any SNS including the domain name' - } - response = api.put(self.session, self.url, self.data) - if not response.status_code == 200: - pytest.fail('Expected 200 OK, got {0}.'.format(response.status_code)) - self.resetdata = { - 'facebook': 'Changed for testing' - } - d = api.put(self.session, self.url, self.resetdata) - if not d.status_code == 200: - pytest.fail('There was a problem performing cleanup') - -# Verify that a user can add and edit social media links -# Endpoint -- api/profiles/mobile_privacy/:value (Y or N) -# Expected Status Code -- 200 OK -# Expected Content -- Make mobile privacy 0 or 1 - def test_put_mobile_privacy(self): - self.session = self.createAuthorizedSession(username, password) - self.url = hostURL + 'api/profiles/mobile_privacy/Y/' - self.data = { - 'IsMobilePhonePrivate': 'Y' - } - response = api.put(self.session, self.url, self.data) - if not response.status_code == 200: - pytest.fail('Expected 200 OK, got {0}.'.format(response.status_code)) - profile_url = hostURL + 'api/profiles/' - check_response = api.get(self.session,profile_url) - assert check_response.json()['IsMobilePhonePrivate'] == 1 - self.url = hostURL + 'api/profiles/mobile_privacy/N/' - self.resetdata = { - 'IsMobilePhonePrivate': 'N' - } - d = api.put(self.session, self.url, self.resetdata) - if not d.status_code == 200: - pytest.fail('There was a problem performing cleanup') - check_response = api.get(self.session,profile_url) - assert check_response.json()['IsMobilePhonePrivate'] == 0 - -# Verify that a user can add and edit social media links -# Endpoint -- api/profiles/image_privacy/:value (Y or N) -# Expected Status Code -- 200 OK -# Expected Content -- - def test_put_image_privacy(self): - self.session = self.createAuthorizedSession(username, password) - self.url = hostURL + 'api/profiles/image_privacy/Y/' - self.data = { - 'show_pic': 'Y' - } - response = api.put(self.session, self.url, self.data) - if not response.status_code == 200: - pytest.fail('Expected 200 OK, got {0}.'.format(response.status_code)) - profile_url = hostURL + 'api/profiles/' - check_response = api.get(self.session,profile_url) - assert check_response.json()['show_pic'] == 1 - self.url = hostURL + 'api/profiles/image_privacy/N/' - self.resetdata = { - 'show_pic': 'N' - } - d = api.put(self.session, self.url, self.resetdata) - if not d.status_code == 200: - pytest.fail('There was a problem performing cleanup') - - check_response = api.get(self.session,profile_url) - assert check_response.json()['show_pic'] == 0 - - -class Test_allSessionTest(testCase): - -# # # # # # # # # -# SESSIONS TEST # -# # # # # # # # # - -# Verify that an activity leader can get all session objects -# Endpoint -- api/sessions/ -# Expected Status Code -- 200 OK -# Expected Response Body -- List of all session resources - def test_get_all_sessions(self): - self.session = self.createAuthorizedSession(username, password) - self.url = hostURL + 'api/sessions/' - response = api.get(self.session, self.url) - if not response.status_code == 200: - pytest.fail('Expected 200 OK, got {0}.'.format(response.status_code)) - try: - response.json() - except ValueError: - pytest.fail('Expected Json response body, got {0}.'.format(response.json())) - if not (type(response.json()) is list): - pytest.fail('Expected list, got {0}.'.format(response.json())) - assert response.json()[0]["SessionCode"] == "201509" - assert response.json()[0]["SessionDescription"] == "Fall 15-16 Academic Year" - assert response.json()[0]["SessionBeginDate"] == "2015-08-26T00:00:00" - assert response.json()[0]["SessionEndDate"] == "2015-12-18T00:00:00" - - self.url = hostURL + 'api/sessions/current/' - current = api.get(self.session, self.url) - assert response.json()[-2]["SessionCode"] == current.json()["SessionCode"] - assert response.json()[-2]["SessionDescription"] == current.json()["SessionDescription"] - assert response.json()[-2]["SessionBeginDate"] == current.json()["SessionBeginDate"] - assert response.json()[-2]["SessionEndDate"] == current.json()["SessionEndDate"] - -# Verify that an activity leader can get a session object -# Endpoint -- api/sessions/:id -# Expected Status Code -- 200 OK -# Expected Response Body -- A session resource. - def test_get_one_session(self): - self.session = self.createAuthorizedSession(username, password) - self.url = hostURL + 'api/sessions/' + session_code + '/' - - response = api.get(self.session, self.url) - if not response.status_code == 200: - pytest.fail('Expected 200 OK, got {0}.'.format(response.status_code)) - try: - response.json() - except ValueError: - pytest.fail('Expected Json response body, got {0}.'.format(response.text)) - try: - response.json()['SessionCode'] - except KeyError: - pytest.fail('Expected SessionCode in response, got {0}.'.format(response.json())) - assert response.json()['SessionCode'] == session_code - -# Verify that an user can get the current session -# Endpoint -- api/sessions/current/ -# Expected Status Code -- 200 OK -# Expected Response Body -- the current session - def test_get_current_session(self): - self.session = self.createAuthorizedSession(username, password) - self.url = hostURL + 'api/sessions/current/' - response = api.get(self.session, self.url) - if not response.status_code == 200: - pytest.fail('Expected 200 OK, got {0}.'.format(response.status_code)) - try: - response.json() - except ValueError: - pytest.fail('Expected Json response body, got {0}.'.format(response.text)) - try: - response.json()['SessionCode'] - except KeyError: - pytest.fail('Expected SessionCode in response, got {0}.'.format(response.json())) - -# Verify that an user can get the days left of the session -# Endpoint -- api/sessions/daysLeft/ -# Expected Status Code -- 200 OK -# Expected Response Body -- numbers of days left - def test_get_daysLeft_session(self): - self.session = self.createAuthorizedSession(username, password) - self.url = hostURL + 'api/sessions/daysLeft/' - - response = api.get(self.session, self.url) - if not response.status_code == 200: - pytest.fail('Expected 200 OK, got {0}.'.format(response.status_code)) - try: - response.json() - except ValueError: - pytest.fail('Expected Json response body, got {0}.'.format(response.text)) - try: - response.json() - except KeyError: - pytest.fail('Expected SessionCode in response, got {0}.'.format(response.json())) - -class Test_AllDiningTest(testCase): -# # # # # # # # # -# DINING TESTS # -# # # # # # # # # - -# Verify that a student user can get meal plan data. -# Endpoint -- api/dining/ -# Expected Status Code -- 200 OK -# Expected Response Body -- A json response with dict containing the student mealplan data - def test_dining_plan_for_student(self): - self.session = self.createAuthorizedSession(username, password) - self.url = hostURL + 'api/dining/' - response = api.get(self.session, self.url) - if not response.status_code == 200: - pytest.fail('Expected 200 OK, got {0}.'.format(response.status_code)) - try: - response.json() - except ValueError: - pytest.fail('Expected Json response body, got {0}.'.format(response.text)) - assert response.json() == "0" - -# Verify that a faculty user can get meal plan data. -# Endpoint -- api/dining/ -# Expected Status Code -- 200 OK -# Expected Response Body -- A json response with dict containing the student mealplan data - def test_dining_plan_for_faculty(self): - self.session = self.createAuthorizedSession(leader_username, leader_password) - self.url = hostURL + 'api/dining/' - response = api.get(self.session, self.url) - if not response.status_code == 200: - pytest.fail('Expected 200 OK, got {0}.'.format(response.status_code)) - try: - response.json() - except ValueError: - pytest.fail('Expected Json response body, got {0}.'.format(response.text)) - assert response.json() == "0" - -class Test_AllStudentEmploymentTest(testCase): - -# # # # # # # # # # # # # # -# STUDENT EMPLOYMENT TEST # -# # # # # # # # # # # # # # - -# Verify that a student user can get their own student employment information -# Pre-Conditions: Need to be logged in as cct.service in visual studio -# Endpoint -- api/studentemployment/ -# Expected Status Code -- 200 OK -# Expected Response Body -- A json response with student employment info - def test_student_employment___regular_member(self): - self.session = self.createAuthorizedSession(username, password) - self.url = hostURL + 'api/studentemployment/' - response = api.get(self.session, self.url) - if not response.status_code == 200: - pytest.fail('Expected 200 OK, got {0}.'.format(response.status_code)) - try: - response.json() - except ValueError: - pytest.fail('Expected Json response body, got {0}.'.format(response.text)) - if not (type(response.json()) is dict): - pytest.fail('Expected dict, got {0}.'.format(response.json())) - -class Test_AllVictoryPromiseTest(testCase): - -# # # # # # # # # # # # # -# VICTORY PROMISE TEST # -# # # # # # # # # # # # # - -# Verify that a student user can get their own victory promise information -# Endpoint -- api/studentemployment/ -# Expected Status Code -- 200 OK -# Expected Response Body -- A json response with victory promise points - def test_victory_promise(self): - self.session = self.createAuthorizedSession(username, password) - self.url = hostURL + 'api/vpscore/' - response = api.get(self.session, self.url) - if not response.status_code == 200: - pytest.fail('Expected 200 OK, got {0}.'.format(response.status_code)) - try: - response.json() - except ValueError: - pytest.fail('Expected Json response body, got {0}.'.format(response.text)) - if not (type(response.json()) is list): - pytest.fail('Expected list, got {0}.'.format(response.json)) - assert response.json()[0]["TOTAL_VP_IM_SCORE"] == 0 - assert response.json()[0]["TOTAL_VP_CC_SCORE"] == 0 - assert response.json()[0]["TOTAL_VP_LS_SCORE"] == 0 - assert response.json()[0]["TOTAL_VP_LW_SCORE"] == 0 - -class Test_AdminTest(testCase): - -# # # # # # # # -# ADMIN TEST # -# # # # # # # # - -# Verify that a super admin get information of a specific admin via GorodnId. -# Endpoint -- api/admins -# Expected Status Code -- 200 OK -# Expected Response Body -- A json response with the student resource - def test_get_all_admin_as_leader(self): - self.session = self.createAuthorizedSession(leader_username, leader_password) - self.url = hostURL + 'api/admins/' - response = api.get(self.session, self.url) - if not response.status_code == 200: - pytest.fail('Expected 200 OK, got {0}.'.format(response.status_code)) - try: - response.json() - except ValueError: - pytest.fail('Expected Json response body, got {0}.'.format(response.text)) - if not (type(response.json()) is list): - pytest.fail('Expected list, got {0}.'.format(response.json)) - assert response.json()[3]['EMAIL'] == "360.FacultyTest@gordon.edu" - assert response.json()[0]['EMAIL'] == "Chris.Carlson@gordon.edu" - assert response.json()[0]['ADMIN_ID'] == 1 - assert response.json()[0]['ID_NUM'] == 8330171 - assert response.json()[0]['USER_NAME'] == "Chris.Carlson" - assert response.json()[0]['EMAIL'] == "Chris.Carlson@gordon.edu" - -# Verify that a super admin get information of all admins. -# Endpoint -- api/admin/_id -# Expected Status Code -- 200 OK -# Expected Response Body -- A json response with the student resource - def test_get_admin(self): - self.session = self.createAuthorizedSession(leader_username, leader_password) - self.url = hostURL + 'api/admins/8330171/' - response = api.get(self.session, self.url) - if not response.status_code == 200: - pytest.fail('Expected 200 OK, got {0}.'.format(response.status_code)) - try: - response.json() - except ValueError: - pytest.fail('Expected Json response body, got {0}.'.format(response.text)) - assert response.json()['EMAIL'] == "Chris.Carlson@gordon.edu" - assert response.json()['ADMIN_ID'] == 1 - assert response.json()['ID_NUM'] == 8330171 - assert response.json()['USER_NAME'] == "Chris.Carlson" - assert response.json()['EMAIL'] == "Chris.Carlson@gordon.edu" - assert response.json()['SUPER_ADMIN'] == True - -