I have created a custom extension which allows me to pull specified data into my visualforce news page. In my extension I have mutliple queries which pull filtered data if used with url parameters and also have my own pagination built in.
Extension:
public with sharing class force_NewsController {
public force_NewsController (){
CountTotalRecords= [SELECT COUNT() FROM News__c];
// pagination filter
String category = Apexpages.currentPage().getParameters().get('cat');
if (category == 'product launches') {
CountTotalRecords = [SELECT COUNT() FROM News__c WHERE Category__c = 'Product Launches'];
} else if (category == 'events') {
CountTotalRecords = [SELECT COUNT() FROM News__c WHERE Category__c = 'Events'];
} else if (category == 'press releases') {
CountTotalRecords = [SELECT COUNT() FROM News__c WHERE Category__c = 'Press Releases'];
} else if (category == 'case studies') {
CountTotalRecords = [SELECT COUNT() FROM News__c WHERE Category__c = 'Case Studies'];
} else {
CountTotalRecords = [SELECT COUNT() FROM News__c];
}
}
public Integer CountTotalRecords{get;set;}
public String QueryString {get;set;}
public Integer OffsetSize = 0;
private Integer QueryLimit = 6;
public string excerpt;
public list<News__c> lstItem {get;set;}
public list<News__c> NewsList {get;set;}
public list<News__c> EventList {get;set;}
public map<id,string> newsmap{get;set;}
public list<News__c> getNewsItems(){
lstItem = new list<News__c>();
String category = Apexpages.currentPage().getParameters().get('cat');
String query = 'SELECT Id, Name, Title__C, Content__c, Publish_Date__c, Category__c, Event_Date_Start__c, Event_Date_End__c, Event_Location__c, ';
query += '(Select Id, Name, LastModifiedDate From Attachments Order By LastModifiedDate DESC) ';
query += 'FROM News__c ';
if (category != null)
{
query += 'WHERE Category__c = :category ';
}
query += 'ORDER BY Publish_Date__c DESC, Name DESC LIMIT :QueryLimit OFFSET :OffsetSize';
lstItem = Database.query(query);
return lstItem;
}
public Boolean getDisablePrevious(){
if(OffsetSize>0){
return false;
}
else return true;
}
public Boolean getDisableNext() {
if (OffsetSize + QueryLimit < countTotalRecords){
return false;
}
else return true;
}
public PageReference Next() {
OffsetSize += QueryLimit;
return null;
}
public PageReference Previous() {
OffsetSize -= QueryLimit;
return null;
}
public list<News__c> getHomeNewsItems(){
NewsList = new list<News__c>();
String query = 'SELECT Id, Name, Title__C, Content__c, Publish_Date__c, Category__c, ';
query += '(Select Id, Name, LastModifiedDate From Attachments Order By LastModifiedDate DESC) ';
query += 'FROM News__c ';
query += 'WHERE Category__c != \'Events\' ';
query += 'ORDER BY Publish_Date__c DESC, Name DESC LIMIT 5';
NewsList = Database.query(query);
return NewsList;
}
public list<News__c> getUpcomingEvents(){
EventList = new list<News__c>();
String query = 'SELECT Id, Name, Title__C, Publish_Date__c, Event_Date_Start__c, Event_Date_End__c, Event_Location__c ';
query += 'FROM News__c ';
query += 'WHERE Category__c = \'Events\' ';
query += 'ORDER BY Event_Date_Start__c ASC, Name DESC LIMIT 3';
EventList = Database.query(query);
return EventList;
}
public LIST<Service_Status__c> getServiceItems() {
return [SELECT Id, Name, Information__c, Status_Colour__c FROM Service_Status__c ORDER BY Priority__c DESC];
}
public LIST<News__c> getAlerts() {
date d = system.today().addDays(-8);
return [SELECT Id, Name, Title__C, Publish_Date__c FROM News__c WHERE Flash_Message__c = TRUE AND Publish_Date__c > :d ORDER BY Publish_Date__c DESC LIMIT 1];
}
}
* SECOND UPDATE*
I have got 79% coverage so far :D
Could someone show me how I can test the pagination methods to get 100% coverage. The following methods still need code coverage:
- getDisablePrevious()
- getDisableNext()
- Next()
- Previous()
Test Class:
@isTest
private class test_NewsController {
static testMethod void NewsItemsTest() {
News__c n = new News__c();
n.Title__c = 'Test Title';
n.Publish_Date__c = system.today();
n.Category__c = 'Press Releases';
n.Content__c = 'Sample text goes here';
insert n;
PageReference pageRef = Page.force_NewsArchive;
Test.setCurrentPage(pageRef);
ApexPages.Standardcontroller sc = new ApexPages.Standardcontroller(n);
force_NewsController nc = new force_NewsController();
list<News__c> news = nc.getNewsItems();
System.assertEquals(1, news.size());
}
static testMethod void HomepageNewsTest() {
News__c n = new News__c();
n.Title__c = 'Test Title';
n.Publish_Date__c = system.today();
n.Category__c = 'Press Releases';
n.Content__c = 'Sample text goes here';
insert n;
News__c n2 = new News__c();
n2.Title__c = 'Test Event';
n2.Publish_Date__c = system.today();
n2.Category__c = 'Events';
n2.Content__c = 'Sample text for event goes here';
n2.Event_Date_Start__c = system.today();
n2.Event_Date_End__c = system.today();
n2.Event_Location__c = 'Compass Centre';
insert n2;
PageReference pageRef = Page.force_NewsArchive;
Test.setCurrentPage(pageRef);
ApexPages.Standardcontroller sc = new ApexPages.Standardcontroller(n);
force_NewsController nc = new force_NewsController();
list<News__c> news = nc.getHomeNewsItems();
System.assertEquals(1, news.size());
}
static testMethod void NewsArchiveFilterTest() {
News__c n = new News__c();
n.Title__c = 'Test Title';
n.Publish_Date__c = system.today();
n.Category__c = 'Press Releases';
n.Content__c = 'Sample text goes here';
insert n;
News__c n2 = new News__c();
n2.Title__c = 'Test Event';
n2.Publish_Date__c = system.today();
n2.Category__c = 'Events';
n2.Content__c = 'Sample text for event goes here';
n2.Event_Date_Start__c = system.today();
n2.Event_Date_End__c = system.today();
n2.Event_Location__c = 'Compass Centre';
insert n2;
News__c n3 = new News__c();
n3.Title__c = 'Test Case Study';
n3.Publish_Date__c = system.today();
n3.Category__c = 'Case Studies';
n3.Content__c = 'Sample text goes here';
insert n3;
News__c n4 = new News__c();
n4.Title__c = 'Test Product Launch';
n4.Publish_Date__c = system.today();
n4.Category__c = 'Product Launches';
n4.Content__c = 'Sample text goes here';
insert n4;
News__c n5 = new News__c();
n5.Title__c = 'Test Incident Update';
n5.Publish_Date__c = system.today();
n5.Category__c = 'Incident Updates';
n5.Content__c = 'Sample text goes here';
insert n5;
PageReference pageRef = Page.force_NewsArchive;
Test.setCurrentPage(pageRef);
ApexPages.Standardcontroller sc = new ApexPages.Standardcontroller(n);
ApexPages.currentPage().getParameters().put('cat', 'Events');
force_NewsController nc = new force_NewsController();
list<News__c> news = nc.getNewsItems();
System.assertEquals(1, news.size());
// SECOND TEST
ApexPages.Standardcontroller sc2 = new ApexPages.Standardcontroller(n);
ApexPages.currentPage().getParameters().put('cat', 'Case Studies');
force_NewsController nc2 = new force_NewsController();
list<News__c> news2 = nc2.getNewsItems();
System.assertEquals(1, news2.size());
// THIRD TEST
ApexPages.Standardcontroller sc3 = new ApexPages.Standardcontroller(n);
ApexPages.currentPage().getParameters().put('cat', 'Press Releases');
force_NewsController nc3 = new force_NewsController();
list<News__c> news3 = nc3.getNewsItems();
System.assertEquals(1, news3.size());
// FOURTH TEST
ApexPages.Standardcontroller sc4 = new ApexPages.Standardcontroller(n);
ApexPages.currentPage().getParameters().put('cat', 'Product Launches');
force_NewsController nc4 = new force_NewsController();
list<News__c> news4 = nc4.getNewsItems();
System.assertEquals(1, news4.size());
// FIFTH TEST
ApexPages.Standardcontroller sc5 = new ApexPages.Standardcontroller(n);
ApexPages.currentPage().getParameters().put('cat', 'Incident Updates');
force_NewsController nc5 = new force_NewsController();
list<News__c> news5 = nc5.getNewsItems();
System.assertEquals(1, news5.size());
}
static testMethod void UpcomingEventsTest() {
News__c n = new News__c();
n.Title__c = 'Test Event';
n.Publish_Date__c = system.today();
n.Category__c = 'Events';
n.Content__c = 'Sample text for event goes here';
n.Event_Date_Start__c = system.today();
n.Event_Date_End__c = system.today();
n.Event_Location__c = 'Compass Centre';
insert n;
PageReference pageRef = Page.force_Homepage;
Test.setCurrentPage(pageRef);
ApexPages.Standardcontroller sc = new ApexPages.Standardcontroller(n);
force_NewsController nc = new force_NewsController();
list<News__c> events = nc.getUpcomingEvents();
System.assertEquals(1, events.size());
}
static testMethod void ServiceItemsTest() {
Service_Status__c ss = new Service_Status__c();
ss.Name = 'Phones';
ss.Priority__c = 1;
ss.Status_Colour__c = 'green';
insert ss;
PageReference pageRef = Page.force_Homepage;
Test.setCurrentPage(pageRef);
ApexPages.Standardcontroller sc = new ApexPages.Standardcontroller(ss);
force_NewsController nc = new force_NewsController();
list<Service_Status__c> serviceitems = nc.getServiceItems();
System.assertEquals(1, serviceitems.size());
}
static testMethod void AlertTest() {
News__c n = new News__c();
n.Title__c = 'Test Alert';
n.Publish_Date__c = system.today();
n.Category__c = 'Incident Updates';
n.Content__c = 'Sample text for event goes here';
n.Flash_Message__c = true;
insert n;
PageReference pageRef = Page.force_Homepage;
Test.setCurrentPage(pageRef);
ApexPages.Standardcontroller sc = new ApexPages.Standardcontroller(n);
force_NewsController nc = new force_NewsController();
list<News__c> events = nc.getAlerts();
System.assertEquals(1, events.size());
}
}
UPDATE 2:
I have attempted some test methods after Mihai's response, however the second test fails, the test returns true instead of false (as expected). Am I using the variables correctly?
static testMethod void getDisablePrevious_WhenOffsetSizeEquals0_ReturnTrue(){
boolean valueExpected;
force_NewsController nc = new force_NewsController();
test.startTest();
valueExpected = nc.getDisablePrevious();
test.stopTest();
System.assertEquals(true, valueExpected);
}
static testMethod void getDisablePrevious_WhenOffsetSizeEquals6_ReturnFalse(){
boolean valueExpected;
Integer OffsetSize = 1;
Integer QueryLimit = 1;
force_NewsController nc = new force_NewsController();
test.startTest();
valueExpected = nc.getDisablePrevious();
test.stopTest();
System.assertEquals(false, valueExpected);
}