2016-12-27 14:09:55 +00:00
< ? php
2016-12-28 14:14:54 +00:00
class PortableInfoboxMobileRenderServiceTest extends WikiaBaseTest {
2016-12-27 14:09:55 +00:00
//todo: https://wikia-inc.atlassian.net/browse/DAT-3076
//todo: we are testing a lot of functionality and have issues with mocking
//todo: we should move all render service test to API tests
protected function setUp () {
$this -> setupFile = dirname ( __FILE__ ) . '/../PortableInfobox.setup.php' ;
parent :: setUp ();
}
private function mockInfoboxRenderServiceHelper ( $input ) {
2016-12-29 10:28:26 +00:00
$extendImageData = isset ( $input [ 'extendImageData' ] ) ? $input [ 'extendImageData' ] : null ;
2016-12-27 14:09:55 +00:00
2016-12-29 10:58:27 +00:00
$mock = $this -> getMockBuilder ( 'Wikia\PortableInfobox\Helpers\PortableInfoboxImagesHelper' )
-> setMethods ( [ 'extendImageData' ] )
2016-12-27 14:09:55 +00:00
-> getMock ();
$mock -> expects ( $this -> any () )
-> method ( 'extendImageData' )
-> will ( $this -> returnValue ( $extendImageData ) );
2016-12-29 10:58:27 +00:00
$this -> mockClass ( 'Wikia\PortableInfobox\Helpers\PortableInfoboxImagesHelper' , $mock );
2016-12-27 14:09:55 +00:00
}
/**
* @ param $html
* @ return string
*/
private function normalizeHTML ( $html ) {
2016-12-29 09:46:13 +00:00
if ( empty ( $hrml ) ) {
return '' ;
}
2016-12-27 14:09:55 +00:00
$DOM = new DOMDocument ( '1.0' );
$DOM -> formatOutput = true ;
$DOM -> preserveWhiteSpace = false ;
$DOM -> loadXML ( $html );
return $DOM -> saveXML ();
}
/**
* @ param $input
* @ param $expectedOutput
* @ param $description
* @ param $mockParams
* @ dataProvider testRenderInfoboxDataProvider
*/
public function testRenderInfobox ( $input , $expectedOutput , $description , $mockParams ) {
2016-12-29 10:58:27 +00:00
$wrapper = new \Wikia\Util\GlobalStateWrapper ( [ 'wgArticleAsJson' => $mockParams [ 'isMercury' ] ? ? true ] );
2016-12-27 14:09:55 +00:00
$this -> mockInfoboxRenderServiceHelper ( $mockParams );
2016-12-28 14:14:54 +00:00
$infoboxRenderService = new PortableInfoboxMobileRenderService ();
2016-12-29 10:58:27 +00:00
$actualOutput = $wrapper -> wrap ( function () use ( $infoboxRenderService , $input ) {
return $infoboxRenderService -> renderInfobox ( $input , '' , '' , '' , '' );
} );
2016-12-27 14:09:55 +00:00
$expectedHtml = $this -> normalizeHTML ( $expectedOutput );
$actualHtml = $this -> normalizeHTML ( $actualOutput );
$this -> assertEquals ( $expectedHtml , $actualHtml , $description );
}
public function testRenderInfoboxDataProvider () {
return [
[
'input' => [ ],
'output' => '' ,
2016-12-29 09:46:13 +00:00
'description' => 'Empty data should yield no infobox markup' ,
2016-12-29 10:28:26 +00:00
'mockParams' => [ ]
2016-12-27 14:09:55 +00:00
],
[
'input' => [
[
'type' => 'title' ,
'data' => [
'value' => 'Test Title'
]
]
],
'output' => ' < aside class = " portable-infobox pi-background " >
< h2 class = " pi-item pi-item-spacing pi-title " > Test Title </ h2 >
</ aside > ' ,
2016-12-29 09:46:13 +00:00
'description' => 'Only title' ,
2016-12-29 10:28:26 +00:00
'mockParams' => [ ]
2016-12-27 14:09:55 +00:00
],
[
'input' => [
[
'type' => 'navigation' ,
'data' => [
'value' => 'navigation value' ,
]
]
],
'output' => ' < aside class = " portable-infobox pi-background " >
< nav class = " pi-navigation pi-item-spacing pi-secondary-background pi-secondary-font " > navigation value </ nav >
</ aside > ' ,
2016-12-29 09:46:13 +00:00
'description' => 'navigation only' ,
2016-12-29 10:28:26 +00:00
'mockParams' => [ ]
2016-12-27 14:09:55 +00:00
],
[
'input' => [
[
'type' => 'data' ,
'data' => [
'label' => 'test label' ,
'value' => 'test value'
]
]
],
'output' => ' < aside class = " portable-infobox pi-background " >
< div class = " pi-item pi-data pi-item-spacing pi-border-color " >
< h3 class = " pi-data-label pi-secondary-font " > test label </ h3 >
< div class = " pi-data-value pi-font " > test value </ div >
</ div >
</ aside > ' ,
2016-12-29 09:46:13 +00:00
'description' => 'Only pair' ,
2016-12-29 10:28:26 +00:00
'mockParams' => [ ]
2016-12-27 14:09:55 +00:00
],
[
'input' => [
[
'type' => 'title' ,
'data' => [
'value' => 'Test Title'
]
],
[
'type' => 'image' ,
'data' => [
[
'alt' => 'image alt' ,
'url' => 'http://image.jpg' ,
'name' => 'image' ,
'key' => 'image' ,
'isVideo' => false
]
]
],
[
'type' => 'data' ,
'data' => [
'label' => 'test label' ,
'value' => 'test value'
]
]
],
'output' => ' < aside class = " portable-infobox pi-background " >
< h2 class = " pi-item pi-item-spacing pi-title " > Test Title </ h2 >
< div class = " pi-item pi-image " >
< img src = " data:image/gif;base64,R0lGODlhAQABAIABAAAAAP///yH5BAEAAAEALAAAAAABAAEAQAICTAEAOw%3D%3D " data - src = " http://image.jpg " class = " pi-image-thumbnail lazy media article-media " alt = " image alt " data - image - key = " test1 " data - image - name = " test1 " data - ref = " 1 " data - params = " [ { "name":"test1", "full":"http://image.jpg"}] " />
</ div >
< div class = " pi-item pi-data pi-item-spacing pi-border-color " >
< h3 class = " pi-data-label pi-secondary-font " > test label </ h3 >
< div class = " pi-data-value pi-font " > test value </ div >
</ div >
</ aside > ' ,
'description' => 'Simple infobox with title, image and key-value pair' ,
'mockParams' => [
'extendImageData' => [
'alt' => 'image alt' ,
'url' => 'http://image.jpg' ,
'name' => 'test1' ,
'key' => 'test1' ,
'ref' => 1 ,
'width' => '400' ,
'height' => '200' ,
'thumbnail' => 'http://image.jpg' ,
'thumbnail2x' => 'http://image2x.jpg' ,
'media-type' => 'image' ,
'isVideo' => false
]
]
],
[
'input' => [
[
'type' => 'title' ,
'data' => [
'value' => 'Test Title'
]
],
[
'type' => 'image' ,
'data' => [ ]
],
[
'type' => 'data' ,
'data' => [
'label' => 'test label' ,
'value' => 'test value'
]
]
],
'output' => ' < aside class = " portable-infobox pi-background " >
< h2 class = " pi-item pi-item-spacing pi-title " > Test Title </ h2 >
< div class = " pi-item pi-data pi-item-spacing pi-border-color " >
< h3 class = " pi-data-label pi-secondary-font " > test label </ h3 >
< div class = " pi-data-value pi-font " > test value </ div >
</ div >
</ aside > ' ,
2016-12-29 09:46:13 +00:00
'description' => 'Simple infobox with title, INVALID image and key-value pair' ,
2016-12-29 10:28:26 +00:00
'mockParams' => [ ]
2016-12-27 14:09:55 +00:00
],
[
'input' => [
[
'type' => 'title' ,
'data' => [
'value' => 'Test Title'
]
],
[
'type' => 'data' ,
'data' => [
'label' => 'test label' ,
'value' => 'test value'
]
]
],
'output' => ' < aside class = " portable-infobox pi-background " >
< h2 class = " pi-item pi-item-spacing pi-title " > Test Title </ h2 >
< div class = " pi-item pi-data pi-item-spacing pi-border-color " >
< h3 class = " pi-data-label pi-secondary-font " > test label </ h3 >
< div class = " pi-data-value pi-font " > test value </ div >
</ div >
</ aside > ' ,
2016-12-29 09:46:13 +00:00
'description' => 'Simple infobox with title, empty image and key-value pair' ,
2016-12-29 10:28:26 +00:00
'mockParams' => [ ]
2016-12-27 14:09:55 +00:00
],
[
'input' => [
[
'type' => 'title' ,
'data' => [
'value' => 'Test Title'
]
],
[
'type' => 'group' ,
'data' => [
'value' => [
[
'type' => 'header' ,
'data' => [
'value' => 'Test Header'
]
],
[
'type' => 'data' ,
'data' => [
'label' => 'test label' ,
'value' => 'test value'
]
],
[
'type' => 'data' ,
'data' => [
'label' => 'test label' ,
'value' => 'test value'
]
]
2016-12-29 09:51:31 +00:00
],
'layout' => 'default' ,
'collapse' => null ,
2016-12-27 14:09:55 +00:00
]
]
],
'output' => ' < aside class = " portable-infobox pi-background " >
< h2 class = " pi-item pi-item-spacing pi-title " > Test Title </ h2 >
< section class = " pi-item pi-group pi-border-color " >
< h2 class = " pi-item pi-header pi-secondary-font pi-item-spacing pi-secondary-background " > Test Header </ h2 >
< div class = " pi-item pi-data pi-item-spacing pi-border-color " >
< h3 class = " pi-data-label pi-secondary-font " > test label </ h3 >
< div class = " pi-data-value pi-font " > test value </ div >
</ div >
< div class = " pi-item pi-data pi-item-spacing pi-border-color " >
< h3 class = " pi-data-label pi-secondary-font " > test label </ h3 >
< div class = " pi-data-value pi-font " > test value </ div >
</ div >
</ section >
</ aside > ' ,
2016-12-29 09:46:13 +00:00
'description' => 'Infobox with title, group with header and two key-value pairs' ,
2016-12-29 10:28:26 +00:00
'mockParams' => [ ]
2016-12-27 14:09:55 +00:00
],
[
'input' => [
[
'type' => 'group' ,
'data' => [
'value' => [
[
'type' => 'header' ,
'data' => [
'value' => 'Test header'
]
],
[
'type' => 'data' ,
'data' => [
'label' => 'test label' ,
'value' => 'test value'
]
],
[
'type' => 'data' ,
'data' => [
'label' => 'test label' ,
'value' => 'test value'
]
]
],
2016-12-29 09:51:31 +00:00
'layout' => 'horizontal' ,
'collapse' => null ,
2016-12-27 14:09:55 +00:00
]
]
],
'output' => ' < aside class = " portable-infobox pi-background " >
< section class = " pi-item pi-group pi-border-color " >
< table class = " pi-horizontal-group " >
< caption
class = " pi-header pi-secondary-font pi-secondary-background pi-item-spacing " > Test header </ caption >
< thead >
< tr >
< th
class = " pi-horizontal-group-item pi-data-label pi-secondary-font pi-border-color pi-item-spacing " > test label </ th >
< th
class = " pi-horizontal-group-item pi-data-label pi-secondary-font pi-border-color pi-item-spacing " > test label </ th >
</ tr >
</ thead >
< tbody >
< tr >
< td
class = " pi-horizontal-group-item pi-data-value pi-font pi-border-color pi-item-spacing " > test value </ td >
< td
class = " pi-horizontal-group-item pi-data-value pi-font pi-border-color pi-item-spacing " > test value </ td >
</ tr >
</ tbody >
</ table >
</ section >
</ aside > ' ,
'description' => 'Infobox with horizontal group' ,
'mockParams' => [
'createHorizontalGroupData' => [
'header' => 'Test header' ,
'labels' => [ 'test label' , 'test label' ],
'values' => [ 'test value' , 'test value' ],
'renderLabels' => true
]
]
],
[
'input' => [
[
'type' => 'group' ,
'data' => [
'value' => [
[
'type' => 'data' ,
'data' => [
'label' => '' ,
'value' => 'test value'
]
],
[
'type' => 'data' ,
'data' => [
'label' => '' ,
'value' => 'test value'
]
]
],
2016-12-29 09:51:31 +00:00
'layout' => 'horizontal' ,
'collapse' => null ,
2016-12-27 14:09:55 +00:00
]
]
],
'output' => ' < aside class = " portable-infobox pi-background " >
< section class = " pi-item pi-group pi-border-color " >
< table class = " pi-horizontal-group pi-horizontal-group-no-labels " >
< tbody >
< tr >
< td
class = " pi-horizontal-group-item pi-data-value pi-font pi-border-color pi-item-spacing " > test value </ td >
< td
class = " pi-horizontal-group-item pi-data-value pi-font pi-border-color pi-item-spacing " > test value </ td >
</ tr >
</ tbody >
</ table >
</ section >
</ aside > ' ,
'description' => 'Infobox with horizontal group without header and labels' ,
'mockParams' => [
'createHorizontalGroupData' => [
'labels' => [ '' , '' ],
'values' => [ 'test value' , 'test value' ],
'renderLabels' => false
]
]
],
[
'input' => [
[
'type' => 'navigation' ,
'data' => [
'value' => '<p>Links</p>'
]
]
],
'output' => ' < aside class = " portable-infobox pi-background " >
< nav class = " pi-navigation pi-item-spacing pi-secondary-background pi-secondary-font " >
< p > Links </ p >
</ nav >
</ aside > ' ,
2016-12-29 09:46:13 +00:00
'description' => 'Infobox with navigation' ,
2016-12-29 10:28:26 +00:00
'mockParams' => [ ]
2016-12-27 14:09:55 +00:00
],
[
'input' => [
[
'type' => 'image' ,
'data' => [
'alt' => 'image alt' ,
'url' => 'http://image.jpg' ,
'ref' => 1 ,
'name' => 'test1' ,
'key' => 'test1' ,
'isVideo' => false
]
]
],
'output' => ' < aside class = " portable-infobox pi-background " >
< div class = " pi-item pi-hero " >
< img
src = " data:image/gif;base64,R0lGODlhAQABAIABAAAAAP///yH5BAEAAAEALAAAAAABAAEAQAICTAEAOw%3D%3D " data - src = " http://image.jpg " class = " pi-image-thumbnail lazy media article-media " alt = " image alt " data - image - key = " test1 " data - image - name = " test1 " data - ref = " 1 " data - params = \ ' [{ " name " : " test1 " , " full " : " http://image.jpg " }] \ ' />
</ div >
</ aside > ' ,
'description' => 'WikiaMobile: Only image. Image is not small- should render hero.' ,
'mockParams' => [
'isMercury' => false ,
'isValidHeroDataItem' => true ,
'extendImageData' => [
'alt' => 'image alt' ,
'url' => 'http://image.jpg' ,
'name' => 'test1' ,
'key' => 'test1' ,
'ref' => 1 ,
'width' => '400' ,
'height' => '200' ,
'thumbnail' => 'http://image.jpg' ,
'thumbnail2x' => 'http://image2x.jpg' ,
'media-type' => 'image' ,
'isVideo' => false
]
]
],
[
'input' => [
[
'type' => 'title' ,
'data' => [
'value' => 'Test <img /><a href="example.com">Title</a>'
]
],
[
'type' => 'image' ,
'data' => [
'url' => 'http://image.jpg' ,
'name' => 'test1' ,
'key' => 'test1' ,
'ref' => 44 ,
'isVideo' => false
]
]
],
'output' => ' < aside class = " portable-infobox pi-background " >
< div class = " pi-item pi-hero " >
< hgroup class = " pi-hero-title-wrapper pi-item-spacing " >
< h2 class = " pi-hero-title " > Test < a href = " example.com " > Title </ a ></ h2 >
</ hgroup >
< img
src = " data:image/gif;base64,R0lGODlhAQABAIABAAAAAP///yH5BAEAAAEALAAAAAABAAEAQAICTAEAOw%3D%3D " data - src = " thumbnail.jpg " class = " pi-image-thumbnail lazy media article-media " alt = " " data - image - key = " test1 " data - image - name = " test1 " data - ref = " 44 " data - params = \ ' [{ " name " : " test1 " , " full " : " http://image.jpg " }] \ ' />
</ div >
</ aside > ' ,
'description' => 'WikiaMobile: Infobox with full hero module with title with HTML tags' ,
'mockParams' => [
'isValidHeroDataItem' => true ,
'isMercury' => false ,
'extendImageData' => [
'url' => 'http://image.jpg' ,
'name' => 'test1' ,
'key' => 'test1' ,
'ref' => 44 ,
'width' => '400' ,
'height' => '200' ,
'thumbnail' => 'thumbnail.jpg' ,
'thumbnail2x' => 'thumbnail2x.jpg' ,
'isVideo' => false ,
'media-type' => 'image'
]
]
],
[
'input' => [
[
'type' => 'image' ,
'data' => [
'alt' => 'image alt' ,
'url' => 'http://image.jpg' ,
'ref' => 1 ,
'name' => 'test1' ,
'key' => 'test1' ,
'isVideo' => false
]
]
],
'output' => ' < aside class = " portable-infobox pi-background " >
< div class = " pi-item pi-hero " >
< figure data - component = " portable-infobox-hero-image " data - attrs = " { "itemContext":"portable-infobox","ref":1} " >
< a href = " http://image.jpg " >
< img class = " article-media-placeholder " src = " data:image/svg+xml;charset=utf-8,%3Csvg xmlns%3D \ 'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg \ ' viewBox%3D \ '0 0 400 200 \ '%2F%3E " alt = " " width = " 400 " height = " 200 " />
< noscript >
< img src = " http://image.jpg " alt = " image alt " width = " 400 " height = " 200 " />
</ noscript >
</ a >
</ figure >
</ div >
</ aside > ' ,
'description' => 'Mercury: Only image. Image is not small- should render hero.' ,
'mockParams' => [
'isValidHeroDataItem' => true ,
'extendImageData' => [
'alt' => 'image alt' ,
'url' => 'http://image.jpg' ,
'name' => 'test1' ,
'key' => 'test1' ,
'ref' => 1 ,
'width' => '400' ,
'height' => '200' ,
'thumbnail' => 'http://image.jpg' ,
'thumbnail2x' => 'http://image2x.jpg' ,
'media-type' => 'image' ,
'isVideo' => false ,
'mercuryComponentAttrs' => json_encode ( [
'itemContext' => 'portable-infobox' ,
'ref' => 1
] )
]
]
],
[
'input' => [
[
'type' => 'title' ,
'data' => [
'value' => 'Test <img /><a href="example.com">Title</a>'
]
],
[
'type' => 'image' ,
'data' => [
'url' => 'http://image.jpg' ,
'name' => 'test1' ,
'key' => 'test1' ,
'ref' => 44 ,
'isVideo' => false
]
]
],
'output' => ' < aside class = " portable-infobox pi-background " >
< div class = " pi-item pi-hero " >
< hgroup class = " pi-hero-title-wrapper pi-item-spacing " >
< h2 class = " pi-hero-title " > Test < a href = " example.com " > Title </ a ></ h2 >
</ hgroup >
< figure data - component = " portable-infobox-hero-image " data - attrs = " { "itemContext":"portable-infobox","ref":44} " >
< a href = " http://image.jpg " >
< img class = " article-media-placeholder " src = " data:image/svg+xml;charset=utf-8,%3Csvg xmlns%3D \ 'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg \ ' viewBox%3D \ '0 0 400 200 \ '%2F%3E " alt = " " width = " 400 " height = " 200 " />
< noscript >
< img src = " http://image.jpg " alt = " " width = " 400 " height = " 200 " />
</ noscript >
</ a >
</ figure >
</ div >
</ aside > ' ,
'description' => 'Mercury: Infobox with full hero module with title with HTML tags' ,
'mockParams' => [
'isValidHeroDataItem' => true ,
'extendImageData' => [
'url' => 'http://image.jpg' ,
'name' => 'test1' ,
'key' => 'test1' ,
'ref' => 44 ,
'width' => '400' ,
'height' => '200' ,
'thumbnail' => 'thumbnail.jpg' ,
'thumbnail2x' => 'thumbnail2x.jpg' ,
'isVideo' => false ,
'media-type' => 'image' ,
'mercuryComponentAttrs' => json_encode ( [
'itemContext' => 'portable-infobox' ,
'ref' => 44
] )
]
]
]
];
}
}