@@ -8,10 +8,17 @@ use App\Helpers\FileStorage\LocalHashFileStorage;
88use App \Helpers \FileStorage \LocalImmutableFile ;
99use App \Helpers \ExercisesConfig ;
1010use App \Helpers \TmpFilesHelper ;
11+ use App \Model \Entity \Assignment ;
1112use App \Model \Entity \AttachmentFile ;
1213use App \Model \Entity \Exercise ;
1314use App \Model \Entity \ExerciseFileLink ;
1415use App \Model \Entity \UploadedFile ;
16+ use App \Model \Repository \Assignments ;
17+ use App \Model \Repository \AttachmentFiles ;
18+ use App \Model \Repository \Exercises ;
19+ use App \Model \Repository \ExerciseFiles ;
20+ use App \Model \Repository \Groups ;
21+ use App \Model \Repository \Logins ;
1522use App \V1Module \Presenters \ExerciseFilesPresenter ;
1623use App \Model \Entity \ExerciseFile ;
1724use Doctrine \ORM \EntityManagerInterface ;
@@ -33,19 +40,24 @@ class TestExerciseFilesPresenter extends Tester\TestCase
3340 /** @var Nette\DI\Container */
3441 protected $ container ;
3542
36- /** @var App\Model\Repository\ ExerciseFiles */
43+ /** @var ExerciseFiles */
3744 protected $ exerciseFiles ;
3845
39- /** @var App\Model\Repository\ Logins */
46+ /** @var Logins */
4047 protected $ logins ;
4148
4249 /** @var Nette\Security\User */
4350 private $ user ;
4451
45- /** @var App\Model\Repository\Exercises */
52+ /** @var Assignments */
53+ protected $ assignments ;
54+ /** @var Groups */
55+ protected $ groups ;
56+
57+ /** @var Exercises */
4658 protected $ exercises ;
4759
48- /** @var App\Model\Repository\ AttachmentFiles */
60+ /** @var AttachmentFiles */
4961 protected $ attachmentFiles ;
5062
5163 public function __construct ()
@@ -54,10 +66,12 @@ class TestExerciseFilesPresenter extends Tester\TestCase
5466 $ this ->container = $ container ;
5567 $ this ->em = PresenterTestHelper::getEntityManager ($ container );
5668 $ this ->user = $ container ->getByType (\Nette \Security \User::class);
57- $ this ->exerciseFiles = $ container ->getByType (\App \Model \Repository \ExerciseFiles::class);
58- $ this ->logins = $ container ->getByType (\App \Model \Repository \Logins::class);
59- $ this ->exercises = $ container ->getByType (App \Model \Repository \Exercises::class);
60- $ this ->attachmentFiles = $ container ->getByType (\App \Model \Repository \AttachmentFiles::class);
69+ $ this ->assignments = $ container ->getByType (Assignments::class);
70+ $ this ->attachmentFiles = $ container ->getByType (AttachmentFiles::class);
71+ $ this ->exercises = $ container ->getByType (Exercises::class);
72+ $ this ->exerciseFiles = $ container ->getByType (ExerciseFiles::class);
73+ $ this ->groups = $ container ->getByType (Groups::class);
74+ $ this ->logins = $ container ->getByType (Logins::class);
6175
6276 // patch container, since we cannot create actual file storage manager
6377 $ fsName = current ($ this ->container ->findByType (FileStorageManager::class));
@@ -142,6 +156,115 @@ class TestExerciseFilesPresenter extends Tester\TestCase
142156 }
143157 }
144158
159+ public function testExerciseFilesUploadOverload ()
160+ {
161+ PresenterTestHelper::loginDefaultAdmin ($ this ->container );
162+
163+ $ user = $ this ->presenter ->users ->getByEmail (PresenterTestHelper::ADMIN_LOGIN );
164+ $ exercise = current (array_filter (
165+ $ this ->presenter ->exercises ->findAll (),
166+ function ($ exercise ) {
167+ return !$ exercise ->getFileLinks ()->isEmpty ();
168+ }
169+ ));
170+ Assert::truthy ($ exercise );
171+
172+ $ oldFiles = [];
173+ foreach ($ exercise ->getExerciseFiles () as $ file ) {
174+ /** @var ExerciseFile $file */
175+ $ oldFiles [$ file ->getName ()] = $ file ->getId ();
176+ }
177+ $ oldFile = $ exercise ->getFileLinks ()->first ()->getExerciseFile ();
178+ $ oldLinks = [];
179+ foreach ($ exercise ->getFileLinks () as $ link ) {
180+ if ($ link ->getExerciseFile ()->getId () === $ oldFile ->getId ()) {
181+ $ oldLinks [$ link ->getKey ()] = $ link ;
182+ }
183+ }
184+
185+ // make an assignment (so we can check it is left unchanged)
186+ $ group = current ($ this ->groups ->findAll ());
187+ Assert::truthy ($ group );
188+
189+ $ assignment = Assignment::assignToGroup ($ exercise , $ group , true , null );
190+ $ this ->assignments ->persist ($ assignment );
191+ $ assignmentFiles = [];
192+ foreach ($ assignment ->getExerciseFiles () as $ file ) {
193+ /** @var ExerciseFile $file */
194+ $ assignmentFiles [$ file ->getName ()] = $ file ->getId ();
195+ }
196+ $ assignmentLinks = $ this ->presenter ->fileLinks ->getLinksMapForAssignment ($ assignment ->getId ());
197+
198+ // prepare a new file
199+ $ filename = $ oldFile ->getName ();
200+ $ file = new UploadedFile ($ filename , new \DateTime (), 42 , $ user );
201+ $ this ->presenter ->uploadedFiles ->persist ($ file );
202+ $ this ->presenter ->uploadedFiles ->flush ();
203+
204+ // Mock file server setup
205+ $ fileStorage = Mockery::mock (FileStorageManager::class);
206+ $ fileStorage ->shouldReceive ("storeUploadedExerciseFile " )->with ($ file )->once ();
207+ $ this ->presenter ->fileStorage = $ fileStorage ;
208+
209+ $ payload = PresenterTestHelper::performPresenterRequest (
210+ $ this ->presenter ,
211+ "V1:ExerciseFiles " ,
212+ "POST " ,
213+ [
214+ "action " => 'uploadExerciseFiles ' ,
215+ 'id ' => $ exercise ->getId ()
216+ ],
217+ [
218+ 'files ' => [$ file ->getId ()]
219+ ]
220+ );
221+
222+ // number of files hasn't changed
223+ Assert::count (count ($ oldFiles ), $ payload );
224+ foreach ($ payload as $ item ) {
225+ Assert::type (App \Model \Entity \ExerciseFile::class, $ item );
226+ }
227+
228+ // all files (except the overloaded one) are unchanged, the overloaded one is new
229+ $ newFileId = null ;
230+ $ this ->presenter ->exercises ->refresh ($ exercise );
231+ Assert::count (count ($ oldFiles ), $ exercise ->getExerciseFiles ());
232+ foreach ($ exercise ->getExerciseFiles () as $ file ) {
233+ /** @var ExerciseFile $file */
234+ Assert::true (array_key_exists ($ file ->getName (), $ oldFiles ));
235+ if ($ file ->getName () !== $ filename ) {
236+ Assert::equal ($ oldFiles [$ file ->getName ()], $ file ->getId ());
237+ } else {
238+ Assert::notEqual ($ oldFiles [$ file ->getName ()], $ file ->getId ());
239+ Assert::equal (42 , $ file ->getFileSize ());
240+ $ newFileId = $ file ->getId ();
241+ }
242+ }
243+ Assert::truthy ($ newFileId );
244+
245+ // links has been properly updated
246+ foreach ($ exercise ->getFileLinks () as $ link ) {
247+ /** @var ExerciseFileLink $link */
248+ Assert::true (array_key_exists ($ link ->getKey (), $ oldLinks ));
249+ $ oldLink = $ oldLinks [$ link ->getKey ()];
250+ Assert::equal ($ oldLink ->getSaveName (), $ link ->getSaveName ());
251+ Assert::equal ($ oldLink ->getRequiredRole (), $ link ->getRequiredRole ());
252+ Assert::equal ($ newFileId , $ link ->getExerciseFile ()->getId ());
253+ }
254+
255+ // assignment is unchanged
256+ $ this ->presenter ->assignments ->refresh ($ assignment );
257+ Assert::count (count ($ assignmentFiles ), $ assignment ->getExerciseFiles ());
258+ foreach ($ assignment ->getExerciseFiles () as $ file ) {
259+ /** @var ExerciseFile $file */
260+ Assert::true (array_key_exists ($ file ->getName (), $ assignmentFiles ));
261+ Assert::equal ($ assignmentFiles [$ file ->getName ()], $ file ->getId ());
262+ }
263+
264+ $ newAssignmentLinks = $ this ->presenter ->fileLinks ->getLinksMapForAssignment ($ assignment ->getId ());
265+ Assert::same ($ assignmentLinks , $ newAssignmentLinks );
266+ }
267+
145268 public function testUploadTooManyExerciseFiles ()
146269 {
147270 $ user = $ this ->presenter ->users ->getByEmail (PresenterTestHelper::ADMIN_LOGIN );
0 commit comments