Oefenweb/cakephp-edexml

View on GitHub
Test/Case/Model/EdexmlTest.php

Summary

Maintainability
D
2 days
Test Coverage
<?php
App::uses('Edexml', 'Edexml.Model');

class TestEdexml extends Edexml {

    public function schoolClasses($schoolClasses) {
        $this->_schoolClasses = $schoolClasses;
    }

/**
 * Test double of `parent::_convertKey`.
 *
 */
    public function convertKey($key) {
        return $this->_convertKey($key);
    }

/**
 * Test double of `parent::_convertNames`.
 *
 */
    public function convertNames($user) {
        return $this->_convertNames($user);
    }

/**
 * Test double of `parent::_convertSchool`.
 *
 */
    public function convertSchool($school) {
        return $this->_convertSchool($school);
    }

/**
 * Test double of `parent::_convertSchoolClass`.
 *
 */
    public function convertSchoolClass($schoolClass) {
        return $this->_convertSchoolClass($schoolClass);
    }

/**
 * Test double of `parent::_convertSchoolClasses`.
 *
 */
    public function convertSchoolClasses($schoolClasses) {
        return $this->_convertSchoolClasses($schoolClasses);
    }

/**
 * Test double of `parent::_convertStudent`.
 *
 */
    public function convertStudent($data) {
        return $this->_convertStudent($data);
    }

/**
 * Test double of `parent::_convertTeacher`.
 *
 */
    public function convertTeacher($data) {
        return $this->_convertTeacher($data);
    }

/**
 * Test double of `parent::_parse`.
 *
 */
    public function parse($filename) {
        return $this->_parse($filename);
    }

}

/**
 * Edexml Test.
 *
 * @property TestEdexml $Edexml
 */
class EdexmlTest extends CakeTestCase {

/**
 * Fixtures.
 *
 * @var array
 */
    public $fixtures = [];

/**
 * setUp method.
 *
 * @return void
 */
    public function setUp() {
        parent::setUp();

        $this->Edexml = ClassRegistry::init('TestEdexml', true);
    }

/**
 * tearDown method.
 *
 * @return void
 */
    public function tearDown() {
        unset($this->Edexml);

        parent::tearDown();
    }

/**
 * Tests `convertKey`.
 *
 * @return void
 */
    public function testConvertKey() {
        $this->assertNull($this->Edexml->convertKey('#001'));
        $this->assertEquals('1', $this->Edexml->convertKey('1'));
        $this->assertEquals('key', $this->Edexml->convertKey('key'));
    }

/**
 * Tests `convertNames`.
 *
 * @return void
 */
    public function testConvertNames() {
        $data = [
            'achternaam' => 'Achternaam',
            'roepnaam' => 'Roepnaam'
        ];
        $expected = [
            'last_name' => $data['achternaam'],
            'first_name' => $data['roepnaam'],
        ];
        $this->assertEquals($expected, $this->Edexml->convertNames($data));

        $data = [
            'achternaam' => 'Achternaam',
            'voorvoegsel' => 'Voorvoegsel',
            'roepnaam' => 'Roepnaam'
        ];
        $expected = [
            'last_name' => $data['voorvoegsel'] . ' ' . $data['achternaam'],
            'first_name' => $data['roepnaam'],
        ];
        $this->assertEquals($expected, $this->Edexml->convertNames($data));
    }

/**
 * Tests `convertSchool`.
 *
 * @return void
 */
    public function testConvertSchool() {
        $data = [
            'schoolkey' => 'schoolkey',
        ];
        $expected = [
            'key' => $data['schoolkey']
        ];
        $this->assertEquals($expected, $this->Edexml->convertSchool($data));

        $data = [
            'schoolkey' => '#001',
        ];
        $expected = [
            'key' => null
        ];
        $this->assertEquals($expected, $this->Edexml->convertSchool($data));

        $data = [];
        $expected = [
            'key' => null
        ];
        $this->assertEquals($expected, $this->Edexml->convertSchool($data));
    }

/**
 * Tests `convertSchoolClass`.
 *
 * @return void
 */
    public function testConvertSchoolClass() {
        $data = [
            '@key' => 'key',
            'naam' => 'naam',
            'jaargroep' => '0'
        ];
        $expected = [
            'key' => $data['@key'],
            'name' => 'naam',
            'grade' => '1'
        ];
        $this->assertEquals($expected, $this->Edexml->convertSchoolClass($data));
    }

/**
 * Tests `convertSchoolClass`.
 *
 *  Yeargroup S.
 *
 * @return void
 */
    public function testConvertSchoolClassYeargroupS() {
        $data = [
            '@key' => 'key',
            'naam' => 'naam',
            'jaargroep' => 'S'
        ];
        $expected = [
            'key' => $data['@key'],
            'name' => 'naam',
            'grade' => '19'
        ];
        $this->assertEquals($expected, $this->Edexml->convertSchoolClass($data));
    }

/**
 * Tests `convertSchoolClasses`.
 *
 * @return void
 */
    public function testConvertSchoolClasses() {
        $data = [
            0 => [
                '@key' => 'key',
                'naam' => 'naam',
                'jaargroep' => '0'
            ]
        ];
        $expected = [
            'key' => [
                'key' => 'key',
                'name' => 'naam',
                'grade' => '1'
            ]
        ];
        $this->assertEquals($expected, $this->Edexml->convertSchoolClasses($data));
    }

/**
 * Tests `convertStudent`.
 *
 * @return void
 */
    public function testConvertStudent() {
        $data = [
            '@key' => 'key',
            'achternaam' => 'Achternaam',
            'roepnaam' => 'Roepnaam',
            'geboortedatum' => '2005-07-19',
            'geslacht' => '0'
        ];
        $expected = [
            'key' => 'key',
            'last_name' => 'Achternaam',
            'first_name' => 'Roepnaam',
            'date_of_birth' => '2005-07-19',
            'gender' => null,
            'grade' => null,
            'SchoolClass' => []
        ];
        $this->assertEquals($expected, $this->Edexml->convertStudent($data));

        $data = [
            '@key' => 'key',
            '@eckid' => 'https://id.school/LL_123467890abcdefghijklmnopqrstuvwxzABCDEFGHIJKLMNOPQRSTUVWXYZ!@#$%^_-',
            'achternaam' => 'Achternaam',
            'roepnaam' => 'Roepnaam',
            'geboortedatum' => '2005-07-19',
            'geslacht' => '0'
        ];
        $expected = [
            'key' => 'key',
            'eckid' => 'https://id.school/LL_123467890abcdefghijklmnopqrstuvwxzABCDEFGHIJKLMNOPQRSTUVWXYZ!@#$%^_-',
            'last_name' => 'Achternaam',
            'first_name' => 'Roepnaam',
            'date_of_birth' => '2005-07-19',
            'gender' => null,
            'grade' => null,
            'SchoolClass' => []
        ];
        $this->assertEquals($expected, $this->Edexml->convertStudent($data));

        $data = [
            '@key' => 'key',
            'achternaam' => 'Achternaam',
            'roepnaam' => 'Roepnaam',
            'geboortedatum' => '2005-07-19',
            'geslacht' => '0',
            'groep' => [
                '@key' => 'key'
            ]
        ];
        $expected = [
            'key' => 'key',
            'last_name' => 'Achternaam',
            'first_name' => 'Roepnaam',
            'date_of_birth' => '2005-07-19',
            'gender' => null,
            'grade' => 10,
            'SchoolClass' => [
                'key' => [
                    'grade' => 10
                ]
            ]
        ];
        $schoolClasses = [
            'key' => [
                'grade' => 10
            ]
        ];
        $this->Edexml->schoolClasses($schoolClasses);
        $this->assertEquals($expected, $this->Edexml->convertStudent($data));

        $data = [
            'achternaam' => 'Achternaam',
            'roepnaam' => 'Roepnaam',
            'geslacht' => '1'
        ];
        $expected = [
            'key' => null,
            'first_name' => 'Roepnaam',
            'last_name' => 'Achternaam',
            'gender' => 'm',
            'date_of_birth' => null,
            'grade' => null,
            'SchoolClass' => []
        ];
        $this->assertEquals($expected, $this->Edexml->convertStudent($data));

        $data = [
            'achternaam' => 'Achternaam',
            'roepnaam' => 'Roepnaam',
            'geslacht' => '2'
        ];
        $actual = $this->Edexml->convertStudent($data);
        $this->assertEquals('Achternaam', $actual['last_name']);
        $this->assertEquals('f', $actual['gender']);

        $data = [
            'achternaam' => 'Achternaam',
            'roepnaam' => 'Roepnaam',
            'geslacht' => '9'
        ];
        $actual = $this->Edexml->convertStudent($data);
        $this->assertEquals('Achternaam', $actual['last_name']);
        $this->assertNull($actual['gender']);

        $data = [
            'achternaam' => 'Achternaam',
            'voorvoegsel' => 'Voorvoegsel',
            'roepnaam' => 'Roepnaam'
        ];
        $actual = $this->Edexml->convertStudent($data);
        $this->assertEquals('Voorvoegsel Achternaam', $actual['last_name']);
        $this->assertEquals('Roepnaam', $actual['first_name']);

        $data = [
            'achternaam' => 'Achternaam',
            'voorletters-1' => 'KLM',
        ];
        $actual = $this->Edexml->convertStudent($data);
        $this->assertEquals('KLM', $actual['first_name']);

        $data = [
            'achternaam' => 'Achternaam',
            'voornamen' => 'Voornaam1 Voornaam2',
        ];
        $actual = $this->Edexml->convertStudent($data);
        $this->assertEquals('Voornaam1 Voornaam2', $actual['first_name']);

        $data = [
            'achternaam' => 'Achternaam',
            'roepnaam' => 'Roepnaam',
            'voornamen' => 'Voornaam1 Voornaam2',
            'voorletters-1' => 'KLM',
        ];
        $actual = $this->Edexml->convertStudent($data);
        $this->assertEquals('Roepnaam', $actual['first_name']);

        // Check dummy key for example #001
        // TODO: what to do when there are no identifiers?
        $data = [
            '@key' => '#001',
            'achternaam' => 'Achternaam',
            'voorvoegsel' => 'Voorvoegsel',
            'roepnaam' => 'Roepnaam'
        ];
        $actual = $this->Edexml->convertStudent($data);
        $this->assertNull($actual['key']);
    }

/**
 * Tests `convertTeacher`.
 *
 * @return void
 */
    public function testConvertTeacher() {
        $data = [
            '@key' => 'key',
            'achternaam' => 'Achternaam',
            'roepnaam' => 'Roepnaam',
        ];
        $expected = [
            'key' => 'key',
            'last_name' => 'Achternaam',
            'first_name' => 'Roepnaam',
            'date_of_birth' => null,
            'gender' => null,
            'grade' => null,
            'email_address' => null,
            'SchoolClass' => []
        ];
        $this->assertEquals($expected, $this->Edexml->convertTeacher($data));

        $data = [
            '@key' => 'key',
            '@eckid' => 'https://id.school/LK_abcdefghijklmnopqrstuvwxzABCDEFGHIJKLMNOPQRSTUVWXYZ123467890!@#$%^_-',
            'achternaam' => 'Achternaam',
            'roepnaam' => 'Roepnaam',
        ];
        $expected = [
            'key' => 'key',
            'eckid' => 'https://id.school/LK_abcdefghijklmnopqrstuvwxzABCDEFGHIJKLMNOPQRSTUVWXYZ123467890!@#$%^_-',
            'last_name' => 'Achternaam',
            'first_name' => 'Roepnaam',
            'date_of_birth' => null,
            'gender' => null,
            'grade' => null,
            'email_address' => null,
            'SchoolClass' => []
        ];
        $this->assertEquals($expected, $this->Edexml->convertTeacher($data));

        $data = [
            '@key' => 'key',
            'achternaam' => 'Achternaam',
            'roepnaam' => 'Roepnaam',
            'emailadres' => 'roepnaam@achternaam.com',
        ];
        $expected = [
            'key' => 'key',
            'last_name' => 'Achternaam',
            'first_name' => 'Roepnaam',
            'date_of_birth' => null,
            'gender' => null,
            'grade' => null,
            'email_address' => 'roepnaam@achternaam.com',
            'SchoolClass' => []
        ];
        $this->assertEquals($expected, $this->Edexml->convertTeacher($data));

        $data = [
            '@key' => 'key',
            'achternaam' => 'Achternaam',
            'voorletters-1' => 'KLM',
            'emailadres' => 'roepnaam@achternaam.com',
        ];
        $expected = [
            'key' => 'key',
            'last_name' => 'Achternaam',
            'first_name' => 'KLM',
            'date_of_birth' => null,
            'gender' => null,
            'grade' => null,
            'email_address' => 'roepnaam@achternaam.com',
            'SchoolClass' => []
        ];
        $this->assertEquals($expected, $this->Edexml->convertTeacher($data));

        $data = [
            '@key' => 'key',
            'achternaam' => 'Achternaam',
            'voornamen' => 'Roepnaam1 Roepnaam2',
            'emailadres' => 'roepnaam@achternaam.com',
        ];
        $expected = [
            'key' => 'key',
            'last_name' => 'Achternaam',
            'first_name' => 'Roepnaam1 Roepnaam2',
            'date_of_birth' => null,
            'gender' => null,
            'grade' => null,
            'email_address' => 'roepnaam@achternaam.com',
            'SchoolClass' => []
        ];
        $this->assertEquals($expected, $this->Edexml->convertTeacher($data));
    }

/**
 * Tests `parseToArray`.
 *
 * @return void
 */
    public function testParseToArray() {
        $filename = CakePlugin::path('Edexml') . 'Test' . DS . 'File' . DS . 'EDEXML-1.0.3' . DS . 'sample-invalid.xml';
        $this->assertFalse($this->Edexml->parseToArray($filename));

        $filename = CakePlugin::path('Edexml') . 'Test' . DS . 'File' . DS . 'EDEXML-1.0.3' . DS . 'sample.xml';
        $data = $this->Edexml->parseToArray($filename);
        $this->assertTrue((bool)$data);

        $actual = $this->Edexml->convert($data);
        $this->assertTrue((bool)$actual);

        $this->assertEquals(count($data['EDEX']['leerlingen']['leerling']), count($actual['Student']));
        $this->assertEquals(count($data['EDEX']['groepen']['groep']), count($actual['SchoolClass']));
        $this->assertEquals(count($data['EDEX']['leerkrachten']['leerkracht']), count($actual['Teacher']));
    }

/**
 * Tests `parseToArray`.
 *
 *  Edex 2.0.
 *
 * @return void
 */
    public function testParseToArrayEdexml20SampleFile() {
        $filename = CakePlugin::path('Edexml') . 'Test' . DS . 'File' . DS . 'EDEXML-2.0' . DS . 'EDEXML.Voorbeeld.2.0.xml';
        $data = $this->Edexml->parseToArray($filename);
        $this->assertTrue((bool)$data);

        $actual = $this->Edexml->convert($data);
        $this->assertTrue((bool)$actual);
    }

/**
 * Tests `parseToArray`.
 *
 *  Edex 2.0.
 *
 * @return void
 */
    public function testParseToArrayEdexml20VlaSampleFile() {
        $filename = CakePlugin::path('Edexml') . 'Test' . DS . 'File' . DS . 'EDEXML-2.0' . DS . 'EDEXML.Voorbeeld.2.0-Vla.xml';
        $data = $this->Edexml->parseToArray($filename);
        $this->assertTrue((bool)$data);

        $actual = $this->Edexml->convert($data);
        $this->assertTrue((bool)$actual);
    }

/**
 * Tests `parseToArray`.
 *
 *  Edex 2.1.
 *
 * @return void
 */
    public function testParseToArrayEdexml21SampleFile() {
        $filename = CakePlugin::path('Edexml') . 'Test' . DS . 'File' . DS . 'EDEXML-2.1' . DS . 'EDEXML.Voorbeeld.2.1.xml';
        $data = $this->Edexml->parseToArray($filename);
        $this->assertTrue((bool)$data);

        $actual = $this->Edexml->convert($data);
        $this->assertTrue((bool)$actual);
    }

/**
 * Tests `parseToArray`.
 *
 *  Edex 2.1.
 *
 * @return void
 */
    public function testParseToArrayEdexml21VlaSampleFile() {
        $filename = CakePlugin::path('Edexml') . 'Test' . DS . 'File' . DS . 'EDEXML-2.1' . DS . 'EDEXML.Voorbeeld.2.1-Vla.xml';
        $data = $this->Edexml->parseToArray($filename);
        $this->assertTrue((bool)$data);

        $actual = $this->Edexml->convert($data);
        $this->assertTrue((bool)$actual);
    }

/**
 * Tests `convert`.
 *
 * @return void
 */
    public function testConvertSingleItemData() {
        $data = [
            'EDEX' => [
                'school' => [
                    'schooljaar' => '2012-2013',
                    'brincode' => '99XX',
                    'dependancecode' => '99',
                    'schoolkey' => '99999',
                    'aanmaakdatum' => '2013-03-27T12:43:06',
                    'auteur' => 'Cito LeerlingVolgSysteem versie 4.6',
                    'xsdversie' => '1.03'
                ],
                'groepen' => [
                    'groep' => [
                        '@key' => '49',
                        'naam' => '1A',
                        'jaargroep' => '1',
                        'mutatiedatum' => '2005-08-29T22:19:18'
                    ]
                ],
                'leerlingen' => [
                    'leerling' => [
                        '@key' => '3580',
                        'achternaam' => 'Achternaam',
                        'voorvoegsel' => 'v. d.',
                        'roepnaam' => 'Roepnaam',
                        'geboortedatum' => '2009-08-07',
                        'geslacht' => '2',
                        'jaargroep' => '4',
                        'etniciteit' => '9',
                        'land' => '?',
                        'land_vader' => '?',
                        'land_moeder' => '?',
                        'gewicht_nieuw' => '?',
                        'gewicht' => '?',
                        'mutatiedatum' => '2011-01-24T15:33:29'
                    ]
                ],
                'leerkrachten' => [
                    'leerkracht' => [
                        '@key' => '75',
                        'achternaam' => 'Achternaam',
                        'roepnaam' => 'Roepnaam',
                        'groepen' => [
                            'groep' => [
                                '@key' => '49'
                            ]
                        ],
                        'mutatiedatum' => '2004-02-07T14:03:18'
                    ]
                ],
                '@xsi:noNamespaceSchemaLocation' => 'EDEXML.structuur.xsd'
            ]
        ];

        $actual = $this->Edexml->convert($data);
        $this->assertTrue(Hash::numeric(array_keys($actual['SchoolClass'])));
        $this->assertTrue(Hash::numeric(array_keys($actual['Student'])));
        $this->assertTrue(Hash::numeric(array_keys($actual['Teacher'])));
    }
}