Skip to main content

This site requires you to update your browser. Your browsing experience maybe affected by not having the most up to date version.

We've moved the forum!

Please use forum.silverstripe.org for any new questions (announcement).
The forum archive will stick around, but will be read only.

You can also use our Slack channel or StackOverflow to ask for help.
Check out our community overview for more options to contribute.

General Questions /

General questions about getting started with SilverStripe that don't fit in any of the categories above.

Moderators: martimiz, Sean, Ed, biapar, Willr, Ingo, swaiba

Unit Testing Pages


Go to End


2 Posts   2076 Views

Avatar
mobius

Community Member, 54 Posts

30 January 2011 at 8:46pm

Edited: 30/01/2011 8:47pm

Hello, I'm attempting to set up unit tests for a module I'm developing.

I'm currently needing to test that a particular page type displays everything as it should (it's a subclass of Page).

I've created the page in my .yml file, and it is being created correctly, but I can't figure out how to GET the page with a functionaltest - I'm just getting a 404...

This is my CompanyPageTest.php file:

<?php

/**
 * Test the features of the Companies page
 * 
 */ 
class CompanyPageTest extends FunctionalTest {
	static $fixture_file = 'csm2/tests/models/clients/Companies.yml';
	
	protected $page;
	
	public function setUp() {
		parent::setUp();
		
		$this->page = $this->objFromFixture('CompanyPage', 'companies');
	}
	
	/**
	 * Return a session that has a user logged in as someone
     */
    public function createSession($fixtureName) {
        return new Session(array(
            'loggedInAs' => $this->idFromFixture('Member', $fixtureName)
        ));
    }
	
	
	public function testIndexListsAllCompanies() {
		Debug::show($this->page->Link());
		$this->get($this->page->Link(), $this->createSession('admin'));
		Debug::show($this->content());
		
		$this->assertPartialMatchBySelector('.name', 'Company A');
		$this->assertPartialMatchBySelector('.name', 'Company B');
	}
}

And this is my Companies.yml file:

Member:
    admin:
      FirstName: Admin
      Surname: Admin
      Email: admin@test.com
    engineer:
        FirstName: Joe
        Surname: Engineer
        Email: joe@test.com
        
Company:
    a:
        Name: Company A
        BillingAddress: 'Company A, PO Box 1234, Some Town'
        PhysicalAddress: '123 Some Road, Some Town'
        AgreedRate: $120
        Phone: (03) 1234567

   b:
	    Name: Company B
            BillingAddress: 'Company B, PO Box 4321, Some Town'
            PhysicalAddress: '321 Some Road, Some Town'
            AgreedRate: $120
            Phone: (03) 7654321

		    
CompanyPage:
    companies:
        Title: Companies
        URLSegment: companies
        CanViewType: LoggedInUsers

Job:
    open-job:
        Title: An Open Job
        Description: Some description on how the job looks
        Due: 17/2/2030
        Status: 'New'
        For: =>Company.a
        CreatedBy: =>Member.admin
        AssignedTo: =>Member.engineer
        SLA:
        Invoice:

The two debug statements in the test code show the url of the page I created ('companies'), and the content of a 404 page. Anyone able to point me in the right direction?

Cheers

Edit: Just noticed that the spacing in the yml code listing is all weird on the forum - I do have it correct in my actual file..

Avatar
mobius

Community Member, 54 Posts

30 January 2011 at 11:04pm

Thanks to ajshort in IRC, I've managed to fix this problem.

End code is:

<?php

/**
 * Test the features of the Companies page
 * 
 */ 
class CompanyPageTest extends FunctionalTest {
	static $fixture_file = 'csm2/tests/models/clients/Companies.yml';
	static $use_draft_site = true;
	
	protected $page;
	
	public function setUp() {
		parent::setUp();
		
		$this->page = $this->objFromFixture('CompanyPage', 'companies');
	}
	
	public function testIndexListsAllCompanies() {
		$this->loginAs('admin');
		$this->get(Director::makeRelative($this->page->Link()));
		
		$this->assertExactMatchBySelector('.name a', array('Company A', 'Company B'));
	}
}

Needed to use $this->loginAs(), and also static $use_draft_site = true;

Cheers!