Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
40 commits
Select commit Hold shift + click to select a range
1edeae3
#90 Create AppFixturesTest
metinbaris Oct 2, 2022
3fbaee6
#90 Update test func name
metinbaris Oct 2, 2022
097aec5
#90 Ignore .vscode files
metinbaris Oct 2, 2022
3500063
#90 Ignore .DS_Store files
metinbaris Oct 2, 2022
198145b
#90 Add getDataSets test, update require_once
metinbaris Oct 2, 2022
95c31f2
#90 Test Create Quiz
metinbaris Oct 3, 2022
54849ec
#90 Test create question
metinbaris Oct 3, 2022
1169412
#90 Add type declarations
metinbaris Oct 3, 2022
54a208f
#90 Fix Answer entity iscorrect getter
metinbaris Oct 3, 2022
4e3e625
#90 Test create answer
metinbaris Oct 3, 2022
dc4c794
#90 Test load function
metinbaris Oct 4, 2022
c0fb745
#90 Remove testLoad() integration test
metinbaris Oct 6, 2022
a51db2d
#90 Update access modifiers
metinbaris Oct 6, 2022
383e038
#90 Remove invoking methods
metinbaris Oct 6, 2022
b04870b
#90 Update naming and spacing
metinbaris Oct 6, 2022
73ad423
#90 Reduce function variables
metinbaris Oct 6, 2022
052c81b
#90 Update AppFixturesTest
metinbaris Oct 6, 2022
83b7138
#90 Remove func not needed
metinbaris Oct 7, 2022
b71c190
#90 Chunk load function
metinbaris Oct 7, 2022
ff76a27
Merge branch 'main' into Create-unit-tests-for-AppFixtures.php
metinbaris Oct 7, 2022
39ce25d
#90 Add function returns and var types
metinbaris Oct 7, 2022
c5ae7dd
#90 Add php docblocks
metinbaris Oct 7, 2022
de2778b
#90 Update file require
metinbaris Oct 7, 2022
ef66dc5
#90 Add javascript-quiz to getFilePaths
metinbaris Oct 7, 2022
e5ddf19
#90 Fix naming
metinbaris Oct 7, 2022
0a81aa2
#90 Update require_once to require
metinbaris Oct 7, 2022
77880dd
#90 Add tests for chunked load function
metinbaris Oct 7, 2022
a9229c1
#90 Update readability
metinbaris Oct 8, 2022
46668b9
#90 Update dockblocks for ObjectManager
metinbaris Oct 9, 2022
759bba0
#90 Import Doctrine\Persistence\ObjectManager
metinbaris Oct 9, 2022
a9f9f02
#90 Add docblocks for properties
metinbaris Oct 9, 2022
32295c9
#90 Import ReflectionClass
metinbaris Oct 9, 2022
57a8dff
#90 Add file paths exists to tests
metinbaris Oct 9, 2022
53ec1be
#90 Add dockblocks for invokeProperty function
metinbaris Oct 9, 2022
6fb0c9c
#90 Update string definitions
metinbaris Oct 9, 2022
b90620d
#90 Fix docblock add func variable to match
metinbaris Oct 9, 2022
3059f5a
#90 Add created quizzes to return
metinbaris Oct 9, 2022
38f91d2
#90 Update var name
metinbaris Oct 9, 2022
5cb4d82
#90 Add created questions to return
metinbaris Oct 9, 2022
8411725
#90 Add created answers to return
metinbaris Oct 9, 2022
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 3 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
@@ -1 +1,3 @@
.idea
.idea
.vscode
.DS_Store
4 changes: 2 additions & 2 deletions api/config/fixtures/quizzes/html-quiz/quiz.php
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
<?php

$question1 = require_once 'questions/question_1.php';
$question2 = require_once 'questions/question_2.php';
$question1 = require 'questions/question_1.php';
$question2 = require 'questions/question_2.php';

/**
* @var array{title:string, slug: string, questions: array{array{content:string, quiz: string, answers: array{array{content: string, is_correct: boolean, display_order: integer}} }}} $quiz
Expand Down
12 changes: 6 additions & 6 deletions api/config/fixtures/quizzes/javascript-quiz/quiz.php
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
<?php

$question1 = require_once 'questions/question_1.php';
$question2 = require_once 'questions/question_2.php';
$question3 = require_once 'questions/question_3.php';
$question4 = require_once 'questions/question_4.php';
$question5 = require_once 'questions/question_5.php';
$question6 = require_once 'questions/question_6.php';
$question1 = require 'questions/question_1.php';
$question2 = require 'questions/question_2.php';
$question3 = require 'questions/question_3.php';
$question4 = require 'questions/question_4.php';
$question5 = require 'questions/question_5.php';
$question6 = require 'questions/question_6.php';

/**
* @var array{title:string, slug: string, questions: array{array{content:string, quiz: string, answers: array{array{content: string, is_correct: boolean, display_order: integer}} }}} $quiz
Expand Down
10 changes: 5 additions & 5 deletions api/config/fixtures/quizzes/python-quiz/quiz.php
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
<?php

$question1 = require_once 'questions/question_1.php';
$question2 = require_once 'questions/question_2.php';
$question3 = require_once 'questions/question_3.php';
$question4 = require_once 'questions/question_4.php';
$question5 = require_once 'questions/question_5.php';
$question1 = require 'questions/question_1.php';
$question2 = require 'questions/question_2.php';
$question3 = require 'questions/question_3.php';
$question4 = require 'questions/question_4.php';
$question5 = require 'questions/question_5.php';

/**
* @var array{title:string, slug: string, questions: array{array{content:string, quiz: string, answers: array{array{content: string, is_correct: boolean, display_order: integer}} }}} $quiz
Expand Down
91 changes: 70 additions & 21 deletions api/src/DataFixtures/AppFixtures.php
Original file line number Diff line number Diff line change
Expand Up @@ -10,34 +10,85 @@

class AppFixtures extends Fixture
{
/** @var ObjectManager */
private $objectManager;

/**
* @param ObjectManager $manager
*/
public function load(ObjectManager $manager): void
{
$this->objectManager = $manager;

$this->createQuizzes();
}

/**
* @return array<int, Quiz> $createdQuizzes
*/
public function createQuizzes(): array
{
$createdQuizzes = [];
$dataSets = $this->getDataSets();

foreach ($dataSets as $quizData) {
$quiz = $this->createQuiz($manager, $quizData);
$quiz = $this->createQuiz($quizData);
$questions = $quizData['questions'];

foreach ($questions as $questionData) {
$question = $this->createQuestion($manager, $questionData, $quiz);
$answers = $questionData['answers'];
foreach ($answers as $answerData) {
$this->createAnswer($manager, $answerData, $question);
}
}
$this->createQuestions($questions, $quiz);

$manager->flush();
$this->objectManager->flush();
$createdQuizzes[] = $quiz;
}

return $createdQuizzes;
}

/**
* @param array{array{content:string, quiz: string, answers: array{array{content: string, is_correct: boolean, display_order: integer}} }} $questions
* @param Quiz $quiz
* @return array<int, Question> $createdQuestions
*/
public function createQuestions(array $questions, Quiz $quiz): array
{
$createdQuestions = [];
foreach ($questions as $questionData) {
$question = $this->createQuestion($questionData, $quiz);
$answers = $questionData['answers'];

$this->createAnswers($answers, $question);

$createdQuestions[] = $question;
}

return $createdQuestions;
}

/**
* @param array{array{content: string, is_correct: boolean, display_order: integer}} $answers
* @param Question $question
* @return array<int, Answer> $createdAnswers
*/
public function createAnswers(array $answers, Question $question): array
{
$createdAnswers = [];
foreach ($answers as $answerData) {
$answer = $this->createAnswer($answerData, $question);
$createdAnswers[] = $answer;
}

return $createdAnswers;
}

/**
* @return array{array{title:string, slug: string, questions: array{array{content:string, quiz: string, answers: array{array{content: string, is_correct: boolean, display_order: integer}} }}}}
*/
protected function getDataSets(): array
public function getDataSets(): array
{
$quizData = [];
$filePaths = $this->getFilePaths();
foreach ($filePaths as $filePath) {
$quizData[] = require_once dirname(__DIR__) . '/../' . $filePath;
$quizData[] = require dirname(__DIR__) . '/../' . $filePath;
}

/**
Expand All @@ -49,53 +100,51 @@ protected function getDataSets(): array
/**
* @return string[]
*/
protected function getFilePaths(): array
public function getFilePaths(): array
{
return [
'config/fixtures/quizzes/html-quiz/quiz.php',
'config/fixtures/quizzes/javascript-quiz/quiz.php',
'config/fixtures/quizzes/python-quiz/quiz.php'
];
}

/**
* @param ObjectManager $manager
* @param array{title: string, slug: string} $data
* @return Quiz
*/
protected function createQuiz(ObjectManager $manager, array $data): Quiz
public function createQuiz(array $data): Quiz
{
$entity = new Quiz();
$entity->setTitle($data['title'])
->setSlug($data['slug']);

$manager->persist($entity);
$this->objectManager->persist($entity);

return $entity;
}

/**
* @param ObjectManager $manager
* @param array{content: string} $data
* @param Quiz $quiz
* @return Question
*/
protected function createQuestion(ObjectManager $manager, array $data, Quiz $quiz): Question
public function createQuestion(array $data, Quiz $quiz): Question
{
$entity = new Question();
$entity->setContent($data['content'])
->setQuiz($quiz);
$manager->persist($entity);
$this->objectManager->persist($entity);

return $entity;
}

/**
* @param ObjectManager $manager
* @param array{content: string, display_order: integer, is_correct: boolean} $data
* @param Question $question
* @return Answer
*/
protected function createAnswer(ObjectManager $manager, array $data, Question $question): Answer
public function createAnswer(array $data, Question $question): Answer
{
$entity = new Answer();
$entity
Expand All @@ -104,7 +153,7 @@ protected function createAnswer(ObjectManager $manager, array $data, Question $q
->setIsCorrect($data['is_correct'])
->setQuestion($question);

$manager->persist($entity);
$this->objectManager->persist($entity);

return $entity;
}
Expand Down
2 changes: 1 addition & 1 deletion api/src/Entity/Answer.php
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,7 @@ public function setContent(string $content): self
return $this;
}

public function isIsCorrect(): ?bool
public function getIsCorrect(): ?bool
{
return $this->is_correct;
}
Expand Down
169 changes: 169 additions & 0 deletions api/tests/unit/config/fixtures/data_fixtures/AppFixturesTest.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,169 @@
<?php

declare(strict_types=1);

namespace App\Tests\unit\config\fixtures\data_fixtures;

use App\DataFixtures\AppFixtures;
use App\Entity\Answer;
use App\Entity\Question;
use App\Entity\Quiz;
use Doctrine\Persistence\ObjectManager;
use PHPUnit\Framework\MockObject\MockObject;
use PHPUnit\Framework\TestCase;
use ReflectionClass;

final class AppFixturesTest extends TestCase
{
/** @var AppFixtures */
private $appFixtures;

/** @var MockObject|ObjectManager */
private $objectManager;

protected function setUp(): void
{
$objectManager = $this->getMockBuilder(ObjectManager::class)
->onlyMethods(['flush', 'persist'])
->getMockForAbstractClass();
$this->objectManager = $objectManager;

$appFixtures = new AppFixtures;
$appFixtures = $this->invokeProperty($appFixtures, 'objectManager', $objectManager);
$this->appFixtures = $appFixtures;
}

/**
* @param object $object
* @param string $propertyName
* @param mixed $parameter
*/
public function invokeProperty(object &$object, string $propertyName, mixed $parameter): object
{
$reflection = new ReflectionClass(get_class($object));
$property = $reflection->getProperty($propertyName);
$property->setAccessible(true);
$property->setValue($object, $parameter);

return $object;
}

public function testLoad()
{
$loadFunction = $this->appFixtures->load($this->objectManager);

self::assertNull($loadFunction);
}

public function testCreateQuizzes()
{
$createdQuizzes = $this->appFixtures->createQuizzes();

self::assertIsArray($createdQuizzes);

foreach ($createdQuizzes as $quiz) {
self::assertInstanceOf(Quiz::class, $quiz);
}
}

public function testCreateQuestions()
{
$html = require dirname(__DIR__) . '/../../../../config/fixtures/quizzes/html-quiz/quiz.php';

$quiz = new Quiz;
$quiz->setTitle('Test title');
$quiz->setSlug('test-slug');

$createdQuestions = $this->appFixtures->createQuestions($html['questions'], $quiz);

self::assertIsArray($createdQuestions);

foreach ($createdQuestions as $question) {
self::assertInstanceOf(Question::class, $question);
}
}

public function testCreateAnswers()
{
$question1 = require dirname(__DIR__) . '/../../../../config/fixtures/quizzes/html-quiz/questions/question_1.php';
$question = new Question;
$question->setContent('Test content');

$createdAnswers = $this->appFixtures->createAnswers($question1[0]['answers'], $question);

self::assertIsArray($createdAnswers);

foreach ($createdAnswers as $answer) {
self::assertInstanceOf(Answer::class, $answer);
}
}

public function testGetDataSets()
{
$result = $this->appFixtures->getDataSets();

self::assertIsArray($result);
}

public function testGetFilePathsMethod()
{
$filePaths = $this->appFixtures->getFilePaths();

self::assertIsArray($filePaths);

foreach ($filePaths as $filePath) {
self::assertFileExists($filePath);
}
}

public function testCreateQuiz()
{
$data = [
'title' => 'Test Quiz Title',
'slug' => 'test-quiz-title'
];

$result = $this->appFixtures->createQuiz($data);

self::assertInstanceOf(Quiz::class, $result);
self::assertEquals("Test Quiz Title", $result->getTitle());
self::assertEquals("test-quiz-title", $result->getSlug());
}

public function testCreateQuestion()
{
$quiz = new Quiz;
$quiz = $this->invokeProperty($quiz, 'id', 10);

$data = [
'content' => 'Test quiz content',
];

$result = $this->appFixtures->createQuestion($data, $quiz);

self::assertInstanceOf(Question::class, $result);
self::assertInstanceOf(Quiz::class, $result->getQuiz());
self::assertEquals(10, $result->getQuiz()->getId());
self::assertEquals("Test quiz content", $result->getContent());
}

public function testCreateAnswer()
{
$question = new Question;
$question = $this->invokeProperty($question, 'id', 10);

$data = [
'content' => 'Test answer content',
'display_order' => 3,
'is_correct' => false
];

$result = $this->appFixtures->CreateAnswer($data, $question);

self::assertInstanceOf(Answer::class, $result);
self::assertEquals(10, $result->getQuestion()->getId());
self::assertEquals("Test answer content", $result->getContent());
self::assertEquals(3, $result->getDisplayOrder());
self::assertEquals(false, $result->getIsCorrect());
}
}
Loading