From 607313171384e590db8cc3378b463b93bbce7176 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?David=20Mudr=C3=A1k?= <david@moodle.com>
Date: Thu, 18 Sep 2014 13:48:40 +0200
Subject: [PATCH] MDL-31936 workshop: Generator able to create submissions and
 assessments

This is a basic implementation of the actual content generation in the workshop
generator. Note the we do not generate actual grading form data (which is what
the grading strategy plugins would do), just their results.
---
 mod/workshop/tests/generator/lib.php  | 59 +++++++++++++++++++++++++++
 mod/workshop/tests/generator_test.php | 53 ++++++++++++++++++++++++
 2 files changed, 112 insertions(+)

diff --git a/mod/workshop/tests/generator/lib.php b/mod/workshop/tests/generator/lib.php
index 7f3713588a9..3774b8c96c9 100644
--- a/mod/workshop/tests/generator/lib.php
+++ b/mod/workshop/tests/generator/lib.php
@@ -97,4 +97,63 @@ class mod_workshop_generator extends testing_module_generator {
 
         return parent::create_instance($record, (array)$options);
     }
+
+    /**
+     * Generates a submission authored by the given user.
+     *
+     * @param int $workshopid Workshop instance id.
+     * @param int $authorid Author user id.
+     * @param stdClass|array $options Optional explicit properties.
+     * @return int The new submission id.
+     */
+    public function create_submission($workshopid, $authorid, $options = null) {
+        global $DB;
+
+        $timenow = time();
+        $options = (array)$options;
+
+        $record = $options + array(
+            'workshopid' => $workshopid,
+            'example' => 0,
+            'authorid' => $authorid,
+            'timecreated' => $timenow,
+            'timemodified' => $timenow,
+            'title' => 'Generated submission',
+            'content' => 'Generated content',
+            'contentformat' => FORMAT_MARKDOWN,
+            'contenttrust' => 0,
+        );
+
+        $id = $DB->insert_record('workshop_submissions', $record);
+
+        return $id;
+    }
+
+    /**
+     * Generates an allocation of the given submission for peer-assessment by the given user
+     *
+     * @param int $submissionid Submission id.
+     * @param int $reviewerid Reviewer's user id.
+     * @param stdClass|array $options Optional explicit properties.
+     * @return int The new assessment id.
+     */
+    public function create_assessment($submissionid, $reviewerid, $options = null) {
+        global $DB;
+
+        $timenow = time();
+        $options = (array)$options;
+
+        $record = $options + array(
+            'submissionid' => $submissionid,
+            'reviewerid' => $reviewerid,
+            'weight' => 1,
+            'timecreated' => $timenow,
+            'timemodified' => $timenow,
+            'grade' => null,
+        );
+
+        $id = $DB->insert_record('workshop_assessments', $record);
+
+        return $id;
+    }
 }
diff --git a/mod/workshop/tests/generator_test.php b/mod/workshop/tests/generator_test.php
index ef39f387567..d0961fb819f 100644
--- a/mod/workshop/tests/generator_test.php
+++ b/mod/workshop/tests/generator_test.php
@@ -52,4 +52,57 @@ class mod_workshop_generator_testcase extends advanced_testcase {
         $this->assertEquals(2, count($records));
         $this->assertEquals('Another workshop', $records[$workshop->id]->name);
     }
+
+    public function test_create_submission() {
+        global $DB;
+        $this->resetAfterTest();
+        $this->setAdminUser();
+
+        $course = $this->getDataGenerator()->create_course();
+        $workshop = $this->getDataGenerator()->create_module('workshop', array('course' => $course));
+        $user = $this->getDataGenerator()->create_user();
+        $this->getDataGenerator()->enrol_user($user->id, $course->id);
+        $workshopgenerator = $this->getDataGenerator()->get_plugin_generator('mod_workshop');
+
+        $id = $workshopgenerator->create_submission($workshop->id, $user->id, array(
+            'title' => 'My custom title',
+        ));
+
+        $submissions = $DB->get_records('workshop_submissions', array('workshopid' => $workshop->id));
+        $this->assertEquals(1, count($submissions));
+        $this->assertTrue(isset($submissions[$id]));
+        $this->assertEquals($submissions[$id]->authorid, $user->id);
+        $this->assertSame('My custom title', $submissions[$id]->title);
+    }
+
+    public function test_create_assessment() {
+        global $DB;
+        $this->resetAfterTest();
+        $this->setAdminUser();
+
+        $course = $this->getDataGenerator()->create_course();
+        $workshop = $this->getDataGenerator()->create_module('workshop', array('course' => $course));
+        $user1 = $this->getDataGenerator()->create_user();
+        $user2 = $this->getDataGenerator()->create_user();
+        $this->getDataGenerator()->enrol_user($user1->id, $course->id);
+        $this->getDataGenerator()->enrol_user($user2->id, $course->id);
+        $workshopgenerator = $this->getDataGenerator()->get_plugin_generator('mod_workshop');
+
+        $submissionid1 = $workshopgenerator->create_submission($workshop->id, $user1->id);
+        $submissionid2 = $workshopgenerator->create_submission($workshop->id, $user2->id);
+
+        $assessmentid1 = $workshopgenerator->create_assessment($submissionid1, $user2->id, array(
+            'weight' => 3,
+            'grade' => 95.00000,
+        ));
+        $assessmentid2 = $workshopgenerator->create_assessment($submissionid2, $user1->id);
+
+        $assessments = $DB->get_records('workshop_assessments');
+        $this->assertTrue(isset($assessments[$assessmentid1]));
+        $this->assertTrue(isset($assessments[$assessmentid2]));
+        $this->assertEquals(3, $assessments[$assessmentid1]->weight);
+        $this->assertEquals(95.00000, $assessments[$assessmentid1]->grade);
+        $this->assertEquals(1, $assessments[$assessmentid2]->weight);
+        $this->assertNull($assessments[$assessmentid2]->grade);
+    }
 }