Here one of the possible solutions for the exercise, it contains only the changes required to make the classes testable.
In this solution some of the design principles violations has been removed as consequence of changes required to make the class testable, other violations are still there.
Can you spot the violations that are sill there? Can you mention a change request or a new feature request that surface one of that violations? Can you suggest a refactoring that remove the violation?
What are the differences between the solution with a static typed language and the one with a dynamically typed language? What are the consequences for the design?