func (controller *homeController) get(rw http.ResponseWriter, req *http.Request) (int, error) { var sites database.Sites // Get active sites with no contacts. err := sites.GetSites(controller.DB, true, false) if err != nil { return http.StatusInternalServerError, err } // Check if all of the active sites have a FirstPing that is not zero. If so // then get the first ping from the database, if available. for i, site := range sites { if site.FirstPing.IsZero() { firstPing, err := site.GetFirstPing(controller.DB) if err != nil { return http.StatusInternalServerError, err } err = site.UpdateSiteFirstPing(controller.DB, firstPing) if err != nil { return http.StatusInternalServerError, err } sites[i].FirstPing = firstPing } } isAuthenticated, user := getCurrentUser(rw, req, controller.authorizer) messages := controller.authorizer.Messages(rw, req) vm := viewmodels.GetHomeViewModel(sites, isAuthenticated, user, messages) return http.StatusOK, controller.template.Execute(rw, vm) }
// TestGetHomeViewModel tests the view model is created as expected. func TestGetHomeViewModel(t *testing.T) { sites := database.Sites{} user := httpauth.UserData{} // First site has no last status change. sites = append(sites, database.Site{Name: "Test 1", IsSiteUp: true}) // Second site was down 2 hours ago. now := time.Now() twoHoursAgo := now.Add(-2 * time.Hour) sites = append(sites, database.Site{Name: "Test 2", IsSiteUp: false, LastStatusChange: twoHoursAgo}) // Third site was up 2 days ago. twodaysAgo := now.Add(-48 * time.Hour) sites = append(sites, database.Site{Name: "Test 3", IsSiteUp: true, LastStatusChange: twodaysAgo}) // Fourth site has no last status change but does have first ping three days ago. threedaysAgo := now.Add(-72 * time.Hour) sites = append(sites, database.Site{Name: "Test 4", IsSiteUp: true, FirstPing: threedaysAgo}) result := viewmodels.GetHomeViewModel(sites, false, user, nil) if result.Nav.Active != "home" { t.Error("Home View Model Active returned incorrect value") } if result.Title != "Go Ping Sites - Home" { t.Error("Home View Model Sites returned incorrect value") } if result.Sites[0].CSSClass != "success" || result.Sites[0].Status != "Up" || result.Sites[0].HowLong != "Unknown" || result.Sites[0].Name != "Test 1" { t.Error("First site returned incorrect values") } if result.Sites[1].CSSClass != "danger" || result.Sites[1].Status != "Down" || result.Sites[1].HowLong != "2 hours ago" || result.Sites[1].Name != "Test 2" { t.Error("Second site returned incorrect values") } if result.Sites[2].CSSClass != "success" || result.Sites[2].Status != "Up" || result.Sites[2].HowLong != "2 days ago" || result.Sites[2].Name != "Test 3" || result.Sites[2].HasNoStatusChanges { t.Error("Third site returned incorrect values") } if result.Sites[3].CSSClass != "success" || result.Sites[3].Status != "Up" || result.Sites[3].HowLong != "3 days ago" || result.Sites[3].Name != "Test 4" || !result.Sites[3].HasNoStatusChanges { t.Error("Fourth site returned incorrect values") } if result.HasSiteWithNoStatusChanges != true { t.Error("Should indicate has site with no status change.") } }
// TestGetHomeViewModel tests the view model is created as expected. func TestGetHomeViewModelWithStatusChanges(t *testing.T) { sites := database.Sites{} user := httpauth.UserData{} // First site was up 2 hours ago. now := time.Now() twoHoursAgo := now.Add(-2 * time.Hour) sites = append(sites, database.Site{Name: "Test 1", IsSiteUp: true, LastStatusChange: twoHoursAgo}) // Second site was down 2 hours ago. sites = append(sites, database.Site{Name: "Test 2", IsSiteUp: false, LastStatusChange: twoHoursAgo}) // Third site was up 2 days ago. twodaysAgo := now.Add(-48 * time.Hour) sites = append(sites, database.Site{Name: "Test 3", IsSiteUp: true, LastStatusChange: twodaysAgo}) result := viewmodels.GetHomeViewModel(sites, false, user, nil) if result.HasSiteWithNoStatusChanges == true { t.Error("Should NOT indicate has site with no status change.") } }