Completed
Push — master ( 48a5d3...028360 )
by Aydin
03:14
created

DatabaseRead   A

Complexity

Total Complexity 10

Size/Duplication

Total Lines 101
Duplicated Lines 0 %

Coupling/Cohesion

Components 1
Dependencies 3

Importance

Changes 4
Bugs 0 Features 0
Metric Value
wmc 10
c 4
b 0
f 0
lcom 1
cbo 3
dl 0
loc 101
rs 10

8 Methods

Rating   Name   Duplication   Size   Complexity  
A __construct() 0 4 1
A getName() 0 4 1
A getDescription() 0 4 1
A getArgs() 0 4 1
A seed() 0 20 3
A verify() 0 10 1
A getType() 0 4 1
A configure() 0 4 1
1
<?php
2
3
namespace PhpSchool\LearnYouPhp\Exercise;
4
5
use Faker\Generator;
6
use PDO;
7
use PhpSchool\PhpWorkshop\Check\DatabaseCheck;
8
use PhpSchool\PhpWorkshop\Check\ListenableCheckInterface;
9
use PhpSchool\PhpWorkshop\Event\Event;
10
use PhpSchool\PhpWorkshop\Event\EventDispatcher;
11
use PhpSchool\PhpWorkshop\Exercise\AbstractExercise;
12
use PhpSchool\PhpWorkshop\Exercise\ExerciseInterface;
13
use PhpSchool\PhpWorkshop\Exercise\ExerciseType;
14
use PhpSchool\PhpWorkshop\ExerciseCheck\DatabaseExerciseCheck;
15
use PhpSchool\PhpWorkshop\ExerciseDispatcher;
16
use PhpSchool\PhpWorkshop\SubmissionPatch;
17
use Symfony\Component\Filesystem\Filesystem;
18
19
/**
20
 * Class DatabaseRead
21
 * @package PhpSchool\LearnYouPhp\Exercise
22
 * @author Michael Woodawrd <[email protected]>
23
 * @author Aydin Hassan <[email protected]>
24
 */
25
class DatabaseRead extends AbstractExercise implements ExerciseInterface, DatabaseExerciseCheck
26
{
27
28
    /**
29
     * @var Generator
30
     */
31
    private $faker;
32
33
    /**
34
     * @var array
35
     */
36
    private $randomRecord;
37
38
    /**
39
     * @param Generator $faker
40
     */
41
    public function __construct(Generator $faker)
42
    {
43
        $this->faker = $faker;
44
    }
45
46
    /**
47
     * @return string
48
     */
49
    public function getName()
50
    {
51
        return 'Database Read';
52
    }
53
54
    /**
55
     * @return string
56
     */
57
    public function getDescription()
58
    {
59
        return 'Read an SQL databases contents';
60
    }
61
62
    /**
63
     * @return array
64
     */
65
    public function getArgs()
66
    {
67
        return [$this->randomRecord['name']];
68
    }
69
    
70
    /**
71
     * @param PDO $db
72
     * @return void
73
     */
74
    public function seed(PDO $db)
75
    {
76
        $db
77
            ->exec('CREATE TABLE IF NOT EXISTS users (id INTEGER PRIMARY KEY, name TEXT, age INTEGER, gender TEXT)');
78
        $stmt = $db->prepare('INSERT INTO users (name, age, gender) VALUES (:name, :age, :gender)');
79
80
        $names = [];
81
        for ($i = 0; $i < $this->faker->numberBetween(5, 15); $i++) {
82
            $name   = $this->faker->name;
83
            $age    = rand(18, 90);
84
            $gender = rand(0, 100) % 2 ? 'male' : 'female';
85
86
            $stmt->execute([':name' => $name, ':age' => $age, ':gender' => $gender]);
87
            $id = $db->lastInsertId();
88
            $names[$id] = $name;
89
        }
90
91
        $randomId = array_rand($names);
92
        $this->randomRecord = ['id' => $randomId, 'name' => $names[$randomId]];
93
    }
94
95
    /**
96
     * @param PDO $db
97
     * @return bool
98
     */
99
    public function verify(PDO $db)
100
    {
101
        $sql = 'SELECT name FROM users WHERE id = :id';
102
        $stmt = $db->prepare($sql);
103
104
        $stmt->execute([':id' => $this->randomRecord['id']]);
105
        $result = $stmt->fetchColumn();
106
        
107
        return $result === 'David Attenborough';
108
    }
109
110
    /**
111
     * @return ExerciseType
112
     */
113
    public function getType()
114
    {
115
        return ExerciseType::CLI();
116
    }
117
118
    /**
119
     * @param ExerciseDispatcher $dispatcher
120
     */
121
    public function configure(ExerciseDispatcher $dispatcher)
122
    {
123
        $dispatcher->requireListenableCheck(DatabaseCheck::class);
124
    }
125
}
126