• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

gcivil-nyu-org / INET-Wednesday-Spring2024-Team-2 / 622

29 Apr 2024 05:01PM UTC coverage: 84.013% (-0.3%) from 84.287%
622

push

travis-pro

web-flow
Merge pull request #177 from gcivil-nyu-org/malu-bugfixes

favorites and image size bugfixes

71 of 106 new or added lines in 5 files covered. (66.98%)

91 existing lines in 3 files now uncovered.

1051 of 1251 relevant lines covered (84.01%)

0.84 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

96.5
/users/tests.py
1
from django.test import TestCase, SimpleTestCase, Client, RequestFactory
1✔
2
from django.urls import reverse
1✔
3

4
from .forms import User, UserSignUpForm, LandlordSignupForm, RentalListingForm
1✔
5
from .models import CustomUser, Rental_Listings, Favorite
1✔
6
from django.contrib.messages import get_messages
1✔
7
from datetime import date, timedelta
1✔
8
from django.core.files.uploadedfile import SimpleUploadedFile
1✔
9
import json
1✔
10
import os
1✔
11
import sys
1✔
12
import unittest
1✔
13
from unittest.mock import patch, MagicMock
1✔
14
from .views import landlord_profile_update, map_view, profile_view_edit, apply_filters
1✔
15
from .forms import User, UserSignUpForm
1✔
16
from .models import CustomUser, Rental_Listings
1✔
17
from .views import map_view
1✔
18

19

20
class CustomUserModelTests(TestCase):
1✔
21
    def test_create_user_with_default_user_type(self):
1✔
22
        user = CustomUser.objects.create_user(username="test_user", password="password")
1✔
23
        self.assertEqual(user.user_type, CustomUser.USER)
1✔
24

25
    def test_create_user_with_landlord_user_type(self):
1✔
26
        user = CustomUser.objects.create_user(
1✔
27
            username="landlord_user", password="password", user_type=CustomUser.LANDLORD
28
        )
29
        self.assertEqual(user.user_type, CustomUser.LANDLORD)
1✔
30

31
    def test_create_superuser_with_default_user_type(self):
1✔
32
        superuser = CustomUser.objects.create_superuser(
1✔
33
            username="superuser", password="password"
34
        )
35
        self.assertEqual(superuser.user_type, CustomUser.USER)
1✔
36

37
    def test_create_superuser_with_landlord_user_type(self):
1✔
38
        superuser = CustomUser.objects.create_superuser(
1✔
39
            username="superuser", password="password", user_type=CustomUser.LANDLORD
40
        )
41
        self.assertEqual(superuser.user_type, CustomUser.LANDLORD)
1✔
42

43

44
class UserSignUpTest(TestCase):
1✔
45
    def test_user_signup_form_display_on_get_request(self):
1✔
46
        response = self.client.get(reverse("user_signup"))
1✔
47
        self.assertEqual(response.status_code, 200)
1✔
48
        self.assertIsInstance(response.context["form"], UserSignUpForm)
1✔
49
        self.assertTemplateUsed(response, "users/signup/signup.html")
1✔
50

51
    def test_user_signup_success_on_valid_post_request(self):
1✔
52
        form_data = {
1✔
53
            "username": "testuser",
54
            "email": "testuser@nyu.edu",
55
            "full_name": "Test User",
56
            "phone_number": "1234567890",
57
            "city": "Test City",
58
            "s3_doclink": "http://example.com/doc",
59
            "password1": "testpassword123",
60
            "password2": "testpassword123",
61
        }
62
        response = self.client.post(reverse("user_signup"), form_data)
1✔
63
        self.assertEqual(User.objects.count(), 1)
1✔
64
        self.assertRedirects(response, reverse("user_homepage"))
1✔
65

66
    def test_user_signup_error_on_invalid_post_request(self):
1✔
67
        form_data = {
1✔
68
            "username": "testuser",
69
            "email": "invalid-email",
70
            "full_name": "Test User",
71
            "phone_number": "1234567890",
72
            "city": "Test City",
73
            "password1": "testpassword123",
74
            "password2": "wrongpassword",
75
        }
76
        response = self.client.post(reverse("user_signup"), form_data)
1✔
77
        self.assertEqual(User.objects.count(), 0)
1✔
78
        self.assertFormError(response, "form", "email", "Enter a valid email address.")
1✔
79

80

81
class LoginProcessTests(TestCase):
1✔
82
    @classmethod
1✔
83
    def setUpTestData(cls):
1✔
84
        # Create a user and a landlord for testing login
85
        cls.user = CustomUser.objects.create_user(
1✔
86
            username="testuser", password="testpassword", user_type=CustomUser.USER
87
        )
88
        cls.landlord = CustomUser.objects.create_user(
1✔
89
            username="testlandlord",
90
            password="testpassword",
91
            user_type=CustomUser.LANDLORD,
92
            verified=True,
93
        )
94
        cls.landlord.save()
1✔
95

96
    def test_user_login_success(self):
1✔
97
        response = self.client.post(
1✔
98
            reverse("user_login"), {"username": "testuser", "password": "testpassword"}
99
        )
100
        self.assertRedirects(response, reverse("user_homepage"))
1✔
101

102

103
class LogoutViewTest(TestCase):
1✔
104
    def test_logout_redirect(self):
1✔
105
        response = self.client.get(reverse("logout"))
1✔
106
        self.assertRedirects(response, "/")
1✔
107

108

109
class Custom404HandlerTest(TestCase):
1✔
110
    def test_redirect_for_authenticated_landlord(self):
1✔
UNCOV
111
        landlord = CustomUser.objects.create_user(
×
112
            username="landlord404", password="password", user_type=CustomUser.LANDLORD
113
        )
114
        self.client.login(username="landlord404", password="password")
×
115
        self.assertIsNotNone(landlord.id)
×
116
        response = self.client.get("/nonexistentpage")
×
UNCOV
117
        self.assertRedirects(response, reverse("landlord_homepage"))
×
118

119
    def test_redirect_for_authenticated_user(self):
1✔
UNCOV
120
        user = CustomUser.objects.create_user(
×
121
            username="user404", password="password", user_type=CustomUser.USER
122
        )
123
        self.client.login(username="user404", password="password")
×
124
        self.assertIsNotNone(user.id)
×
125
        response = self.client.get("/nonexistentpage")
×
UNCOV
126
        self.assertRedirects(response, reverse("user_homepage"))
×
127

128
    def test_redirect_for_unauthenticated_user(self):
1✔
129
        response = self.client.get("/nonexistentpage")
×
UNCOV
130
        self.assertRedirects(response, reverse("index"))
×
131

132

133
class LandlordSignUpTest(TestCase):
1✔
134
    def test_landlord_signup_form_display_on_get_request(self):
1✔
135
        response = self.client.get(reverse("landlord_signup"))
1✔
136
        self.assertEqual(response.status_code, 200)
1✔
137
        self.assertTemplateUsed(response, "signup/landlord_signup.html")
1✔
138

139
    def test_landlord_signup_success_on_valid_post_request(self):
1✔
140
        form_data = {
1✔
141
            "username": "landlorduser",
142
            "email": "landlord@nyu.edu",
143
            "full_name": "Landlord User",
144
            "phone_number": "0987654321",
145
            "city": "Landlord City",
146
            "password1": "landlordpassword123",
147
            "password2": "landlordpassword123",
148
            # Assume "pdf_file" is optional for simplicity; otherwise,
149
            # use SimpleUploadedFile for tests
150
        }
151
        response = self.client.post(reverse("landlord_signup"), form_data)
1✔
152
        self.assertEqual(
1✔
153
            CustomUser.objects.filter(user_type=CustomUser.LANDLORD).count(), 1
154
        )
155
        self.assertRedirects(response, reverse("landlord_login"))
1✔
156

157
    def test_landlord_signup_error_on_invalid_post_request(self):
1✔
158
        form_data = {
1✔
159
            "username": "landlorduser",
160
            "email": "landlorduser@nyu.edu",
161
            # Missing fields
162
            "password1": "landlordpassword123",
163
            "password2": "landlordpassword123",
164
        }
165
        response = self.client.post(reverse("landlord_signup"), form_data)
1✔
166
        self.assertEqual(CustomUser.objects.count(), 0)
1✔
167
        self.assertTrue(response.context["form"].errors)
1✔
168

169

170
class UserSignUpFormTest(TestCase):
1✔
171
    def test_invalid_email_domain(self):
1✔
172
        form_data = {
1✔
173
            "email": "user@example.com",  # Invalid email domain
174
            "full_name": "Test User",
175
            "phone_number": "1234567890",
176
            "city": "New York",
177
            "password1": "strongpassword",
178
            "password2": "strongpassword",
179
        }
180
        form = UserSignUpForm(data=form_data)
1✔
181
        self.assertFalse(form.is_valid())
1✔
182
        self.assertIn("email", form.errors)
1✔
183

184

185
class CustomUserModelStrTest(TestCase):
1✔
186
    def test_custom_user_str(self):
1✔
187
        user = CustomUser.objects.create_user(
1✔
188
            username="testuser", email="testuser@nyu.edu"
189
        )
190
        self.assertEqual(str(user), "testuser")
1✔
191

192

193
class LandingPageViewTest(TestCase):
1✔
194
    def test_landing_page_status_code(self):
1✔
195
        response = self.client.get(reverse("index"))
1✔
196
        self.assertEqual(response.status_code, 200)
1✔
197

198

199
class LogoutTest(TestCase):
1✔
200
    def test_logout_functionality(self):
1✔
201
        user = CustomUser.objects.create_user(username="testuser", password="password")
1✔
202
        self.client.login(username="testuser", password="password")
1✔
203
        response = self.client.get(reverse("logout"))
1✔
204
        self.assertNotIn("_auth_user_id", self.client.session)
1✔
205

206

207
class UserAccessTest(TestCase):
1✔
208
    def test_protected_view_access(self):
1✔
209
        response = self.client.get(reverse("user_homepage"))
1✔
210
        self.assertEqual(response.status_code, 302)  # Redirect to login page
1✔
211

212

213
class PasswordResetViewTest(TestCase):
1✔
214
    def test_password_reset_page(self):
1✔
215
        response = self.client.get(reverse("password_reset_form"))
1✔
216
        self.assertEqual(response.status_code, 200)
1✔
217

218

219
# class RentalsPageViewTest(TestCase):
220
#     def test_rentals_page_view(self):
221
#         response = self.client.get(reverse('rentalspage'))
222
#         self.assertEqual(response.status_code, 302)
223
#         self.assertTemplateUsed(response, 'users/searchRental/rentalspage.html')
224

225

226
class RentalListingsModelTests(TestCase):
1✔
227
    def setUp(self):
1✔
UNCOV
228
        self.user = CustomUser.objects.create_user(
×
229
            username="testuser", email="test@nyu.edu", password="testpass123"
230
        )
231

232
    # def test_rental_listing_creation(self):
233
    #     listing = Rental_Listings.objects.create(
234
    #         address='123 Test St',
235
    #         price=2000.00,
236
    #         Landlord=self.user,
237
    #         Submitted_date=date.today()
238
    #     )
239
    #     self.assertEqual(Rental_Listings.objects.count(), 1)
240
    #     self.assertEqual(listing.address, '123 Test St')
241
    #     self.assertEqual(listing.Landlord, self.user)
242

243

244
class UserSignUpFormTests(TestCase):
1✔
245
    def test_clean_email_valid(self):
1✔
246
        form_data = {
1✔
247
            "username": "valid@nyu.edu",
248
            "email": "valid@nyu.edu",
249
            "password1": "testpassword",
250
            "password2": "testpassword",
251
            "full_name": "Valid User",
252
            "phone_number": "1234567890",
253
            "city": "New York",
254
        }
255
        form = UserSignUpForm(data=form_data)
1✔
256
        self.assertTrue(form.is_valid())
1✔
257

258
    def test_clean_email_invalid_domain(self):
1✔
259
        form_data = {
1✔
260
            "username": "invalid@gmail.com",
261
            "email": "invalid@gmail.com",
262
            "password1": "testpassword",
263
            "password2": "testpassword",
264
            "full_name": "Invalid User",
265
            "phone_number": "1234567890",
266
            "city": "New York",
267
        }
268
        form = UserSignUpForm(data=form_data)
1✔
269
        self.assertFalse(form.is_valid())
1✔
270
        self.assertIn("email", form.errors)
1✔
271

272

273
class LandlordSignupFormTests(TestCase):
1✔
274
    def test_form_save(self):
1✔
275
        form_data = {
1✔
276
            "username": "landlord@nyu.edu",
277
            "email": "landlord@nyu.edu",
278
            "password1": "landlordpassword",
279
            "password2": "landlordpassword",
280
            "full_name": "Landlord User",
281
            "phone_number": "9876543210",
282
            "city": "New York",
283
        }
284
        form = LandlordSignupForm(data=form_data)
1✔
285
        self.assertTrue(form.is_valid())
1✔
286
        landlord = form.save()
1✔
287
        self.assertEqual(landlord.email, "landlord@nyu.edu")
1✔
288
        self.assertEqual(landlord.user_type, CustomUser.LANDLORD)
1✔
289

290

291
class FavoriteModelTests(TestCase):
1✔
292
    def setUp(self):
1✔
293
        self.user = CustomUser.objects.create_user(
1✔
294
            username="favuser", email="favuser@nyu.edu", password="testpass123"
295
        )
296
        self.listing = Rental_Listings.objects.create(
1✔
297
            address="123 Fav St", price=1500.00, baths=1, Landlord=self.user
298
        )
299
        self.client = Client()
1✔
300
        self.client.login(username="favuser", password="testpass123")
1✔
301
        self.toggle_favorite_url = reverse("toggle_favorite")
1✔
302

303
    def test_toggle_favorite_add(self):
1✔
304
        response = self.client.post(
1✔
305
            self.toggle_favorite_url, {"listing_id": self.listing.id}
306
        )
307
        self.assertEqual(response.status_code, 200)
1✔
308
        self.assertEqual(Favorite.objects.count(), 1)
1✔
309
        self.assertJSONEqual(
1✔
310
            str(response.content, encoding="utf8"), {"status": "added"}
311
        )
312

313
    def test_toggle_favorite_remove(self):
1✔
314
        Favorite.objects.create(user=self.user, listing=self.listing)
1✔
315
        response = self.client.post(
1✔
316
            self.toggle_favorite_url, {"listing_id": self.listing.id}
317
        )
318
        self.assertEqual(response.status_code, 200)
1✔
319
        self.assertEqual(Favorite.objects.count(), 0)
1✔
320
        self.assertJSONEqual(
1✔
321
            str(response.content, encoding="utf8"), {"status": "removed"}
322
        )
323

324
    def test_toggle_favorite_with_invalid_listing(self):
1✔
325
        response = self.client.post(
1✔
326
            self.toggle_favorite_url, {"listing_id": 9999}
327
        )  # Assuming 9999 is an invalid ID
328
        self.assertEqual(response.status_code, 404)
1✔
329
        self.assertJSONEqual(
1✔
330
            str(response.content, encoding="utf8"), {"error": "Listing not found"}
331
        )
332

333
    def test_toggle_favorite_without_listing_id(self):
1✔
334
        response = self.client.post(self.toggle_favorite_url, {})
1✔
335
        self.assertEqual(response.status_code, 400)
1✔
336
        self.assertJSONEqual(
1✔
337
            str(response.content, encoding="utf8"), {"error": "Listing ID is required"}
338
        )
339

340

341
class LogoutViewTests(TestCase):
1✔
342
    def test_logout(self):
1✔
343
        self.client.login(username="testuser", password="testpass123")
1✔
344
        response = self.client.get(reverse("logout"))
1✔
345
        self.assertRedirects(response, "/")
1✔
346

347

348
class HomeViewTests(TestCase):
1✔
349
    def test_home_view_status_code(self):
1✔
350
        response = self.client.get(reverse("index"))
1✔
351
        self.assertEqual(response.status_code, 200)
1✔
352

353

354
# class UserHomeViewTests(TestCase):
355
#     def test_user_home_redirect_for_anonymous(self):
356
#         response = self.client.get(reverse('user_homepage'), follow=True)
357
#         self.assertRedirects(response, '/login/user_login?next=/user/home/')
358

359
# class LandlordHomeViewTests(TestCase):
360
#     def test_landlord_home_redirect_for_anonymous(self):
361
#         response = self.client.get(reverse('landlord_homepage'), follow=True)
362
#         self.assertRedirects(response, '/login/landlord_login?next=/landlord/home/')
363

364

365
class RentalsPageViewTests(TestCase):
1✔
366
    def test_rentals_page_for_user(self):
1✔
367
        self.client.login(username="testuser", password="testpass123")
1✔
368
        response = self.client.get(reverse("rentalspage"))
1✔
369
        self.assertEqual(response.status_code, 302)
1✔
370

371

372
# class FavoritesPageViewTests(TestCase):
373
#     def test_favorites_page_for_user(self):
374
#         self.client.login(username='testuser', password='testpass123')  # Make sure the user is logged in
375
#         response = self.client.get(reverse('favorites_page'))
376
#         self.assertEqual(response.status_code, 200)
377

378

379
class UserSignUpViewTests(TestCase):
1✔
380
    def test_user_signup_with_invalid_data(self):
1✔
381
        response = self.client.post(reverse("user_signup"), {})
1✔
382
        self.assertEqual(response.status_code, 200)
1✔
383
        self.assertTrue(response.context["form"].errors)
1✔
384

385

386
class LandlordSignUpViewTests(TestCase):
1✔
387
    def test_landlord_signup_with_valid_data(self):
1✔
388
        form_data = {
1✔
389
            "username": "newlandlord",
390
            "email": "newlandlord@nyu.edu",
391
            "password1": "landlordpassword123",
392
            "password2": "landlordpassword123",
393
            "full_name": "New Landlord",
394
            "phone_number": "1234567890",
395
            "city": "New York City",
396
        }
397
        response = self.client.post(reverse("landlord_signup"), form_data)
1✔
398
        self.assertRedirects(response, reverse("landlord_login"))
1✔
399
        self.assertEqual(
1✔
400
            CustomUser.objects.filter(user_type=CustomUser.LANDLORD).count(), 1
401
        )
402

403

404
class UserLoginViewTests(TestCase):
1✔
405
    def test_user_login_redirect(self):
1✔
406
        user = CustomUser.objects.create_user(
1✔
407
            username="loginuser", email="loginuser@nyu.edu", password="password"
408
        )
409
        response = self.client.post(
1✔
410
            reverse("user_login"), {"username": "loginuser", "password": "password"}
411
        )
412
        self.assertRedirects(response, reverse("user_homepage"))
1✔
413

414

415
# class UserHomePageViewTests(TestCase):
416
#     def test_user_homepage_access_unauthenticated(self):
417
#         response = self.client.get(reverse("user_homepage"))
418
#         self.assertEqual(response.status_code, 302)
419
#         self.assertTrue(reverse("user_login") in response.url)
420

421

422
class UserHomePageAuthenticatedAccessTests(TestCase):
1✔
423
    def test_user_homepage_access_authenticated(self):
1✔
424
        user = CustomUser.objects.create_user(
1✔
425
            username="testuserhome", email="testuserhome@nyu.edu", password="password"
426
        )
427
        self.client.login(username="testuserhome", password="password")
1✔
428
        response = self.client.get(reverse("user_homepage"))
1✔
429
        self.assertEqual(response.status_code, 200)
1✔
430

431

432
class LogoutFunctionalityTests(TestCase):
1✔
433
    def test_logout_redirects_to_home(self):
1✔
434
        self.client.login(username="testuser", password="testpass123")
1✔
435
        response = self.client.get(reverse("logout"))
1✔
436
        self.assertRedirects(response, reverse("index"))
1✔
437

438

439
class RentalListingsAccessTests(TestCase):
1✔
440
    def test_rental_listings_access_by_authenticated_user(self):
1✔
441
        self.client.login(username="testuser", password="testpass123")
1✔
442
        response = self.client.get(reverse("rentalspage"))
1✔
443
        self.assertEqual(response.status_code, 302)
1✔
444

445

446
class LandlordSignupWithFileTest(TestCase):
1✔
447
    @patch("users.views.boto3.client")
1✔
448
    def test_landlord_signup_with_file(self, mock_boto3_client):
1✔
449
        mock_s3_client = mock_boto3_client.return_value
1✔
450
        mock_s3_client.upload_fileobj.return_value = None  # Simulate successful upload
1✔
451

452
        form_data = {
1✔
453
            "username": "landlordfile@nyu.edu",
454
            "email": "landlordfile@nyu.edu",
455
            "password1": "landlordpassword",
456
            "password2": "landlordpassword",
457
            "full_name": "Landlord File",
458
            "phone_number": "9876543210",
459
            "city": "New York",
460
            "pdf_file": SimpleUploadedFile(
461
                "test_file.pdf",
462
                b"These are the file contents.",
463
                content_type="application/pdf",
464
            ),
465
        }
466
        response = self.client.post(reverse("landlord_signup"), form_data)
1✔
467
        self.assertRedirects(response, reverse("landlord_login"))
1✔
468
        self.assertTrue(
1✔
469
            CustomUser.objects.filter(email="landlordfile@nyu.edu").exists()
470
        )
471

472

473
class UserLoginRedirectTest(TestCase):
1✔
474
    @classmethod
1✔
475
    def setUpTestData(cls):
1✔
476
        cls.user = CustomUser.objects.create_user(
1✔
477
            username="testuserredirect",
478
            email="userredirect@nyu.edu",
479
            password="password123",
480
            user_type=CustomUser.USER,
481
        )
482

483
    def test_user_login_redirect_to_user_homepage(self):
1✔
484
        self.client.login(username="testuserredirect", password="password123")
1✔
485
        response = self.client.get(reverse("user_homepage"))
1✔
486
        self.assertEqual(response.status_code, 200)
1✔
487

488

489
class Custom404HandlerTest(TestCase):
1✔
490
    def test_404_redirect_for_anonymous_user(self):
1✔
491
        response = self.client.get("/thispagedoesnotexist")
1✔
492
        self.assertRedirects(response, reverse("index"))
1✔
493

494
    def test_404_redirect_for_authenticated_user(self):
1✔
495
        user = CustomUser.objects.create_user(
1✔
496
            username="user404test", password="password"
497
        )
498
        self.client.login(username="user404test", password="password")
1✔
499
        response = self.client.get("/thispagedoesnotexist")
1✔
500
        self.assertRedirects(response, reverse("user_homepage"))
1✔
501

502

503
class ToggleFavoriteTest(TestCase):
1✔
504
    @classmethod
1✔
505
    def setUpTestData(cls):
1✔
UNCOV
506
        cls.user = CustomUser.objects.create_user(
×
507
            username="favuser",
508
            email="favuser@nyu.edu",
509
            password="testpass123",
510
            user_type=CustomUser.USER,
511
        )
UNCOV
512
        cls.listing = Rental_Listings.objects.create(
×
513
            address="123 Fav St", price=1500.00, baths=1, Landlord=cls.user
514
        )
515

516
    # def test_toggle_favorite_add(self):
517
    #     self.client.login(username='favuser', password='testpass123')
518
    #     response = self.client.post(reverse('toggle_favorite'), json.dumps({'listing_id': self.listing.id}), content_type='application/json')
519
    #     self.assertEqual(response.status_code, 400)
520
    #     self.assertTrue(Favorite.objects.filter(user=self.user, listing=self.listing).exists())
521

522

523
class LandlordUserPageAccessTest(TestCase):
1✔
524
    @classmethod
1✔
525
    def setUpTestData(cls):
1✔
526
        cls.landlord_user = CustomUser.objects.create_user(
1✔
527
            username="landlorduser",
528
            email="landlorduser@nyu.edu",
529
            password="testpass123",
530
            user_type=CustomUser.LANDLORD,
531
        )
532
        cls.user = CustomUser.objects.create_user(
1✔
533
            username="normaluser",
534
            email="normaluser@nyu.edu",
535
            password="testpass123",
536
            user_type=CustomUser.USER,
537
        )
538

539
    def test_landlord_accessing_user_page(self):
1✔
540
        self.client.login(username="landlorduser", password="testpass123")
1✔
541
        response = self.client.get(reverse("user_homepage"))
1✔
542
        self.assertNotEqual(response.status_code, 200)
1✔
543

544
    def test_user_accessing_landlord_page(self):
1✔
545
        self.client.login(username="normaluser", password="testpass123")
1✔
546
        response = self.client.get(reverse("landlord_homepage"))
1✔
547
        self.assertNotEqual(response.status_code, 200)
1✔
548

549

550
class ListingDetailViewTest(TestCase):
1✔
551
    def setUp(self):
1✔
552
        self.client = Client()
1✔
553
        self.user = User.objects.create_user(username="testuser", password="password")
1✔
554
        self.client.login(username="testuser", password="password")
1✔
555

556
        self.listing = Rental_Listings.objects.create(
1✔
557
            address="123 Main St",
558
            beds=2,
559
            baths=2,
560
            price=2000,
561
            borough="Brooklyn",
562
            neighborhood="Park Slope",
563
            sq_ft=1000,
564
            Availability_Date="2024-04-03",
565
            latitude=40.1234,
566
            longitude=-73.5678,
567
        )
568

569
    # def test_listing_detail_view(self):
570
    #     response = self.client.get(
571
    #         reverse("listing_detail", kwargs={"listing_id": self.listing.pk})
572
    #     )
573
    #     self.assertEqual(response.status_code, 200)
574
    #     self.assertContains(response, self.listing.address)
575
    #     self.assertContains(response, self.listing.beds)
576
    #     self.assertContains(response, self.listing.baths)
577

578
    def test_toggle_favorite_ajax(self):
1✔
579
        response = self.client.post(
1✔
580
            reverse("toggle_favorite"), {"listing_id": self.listing.pk}
581
        )
582
        self.assertEqual(response.status_code, 200)
1✔
583

584
    def test_listing_detail_not_found(self):
1✔
585
        non_existent_listing_id = 99999  # Assuming this ID does not exist
1✔
586
        response = self.client.get(
1✔
587
            reverse("listing_detail", kwargs={"listing_id": non_existent_listing_id})
588
        )
589
        self.assertEqual(response.status_code, 302)
1✔
590

591

592
# class InitTestCase(TestCase):
593
#     def test_default_settings(self):
594
#         # Do not set ENV_NAME or set it to a value other than "prod" or "develop"
595
#         from rent_wise_nyc import settings
596
#         # Assert that settings imported from local.py are correctly applied
597
#         self.assertEqual(settings.ALLOWED_HOSTS, ["127.0.0.1"])
598

599

600
class ManagePyTestCase(unittest.TestCase):
1✔
601
    @patch.dict(os.environ, {"DJANGO_SETTINGS_MODULE": "rent_wise_nyc.settings"})
1✔
602
    @patch("django.core.management.execute_from_command_line")
1✔
603
    def test_main_success(self, mock_execute_from_command_line):
1✔
604
        from manage import main
1✔
605

606
        main()
1✔
607
        mock_execute_from_command_line.assert_called_once_with(sys.argv)
1✔
608

609
    @patch("django.core.management.execute_from_command_line", side_effect=ImportError)
1✔
610
    def test_main_import_error(self, mock_execute_from_command_line):
1✔
611
        from manage import main
1✔
612

613
        with self.assertRaises(ImportError):
1✔
614
            main()
1✔
615

616

617
# class MapViewTestCase(TestCase):
618
#     def setUp(self):
619
#         self.factory = RequestFactory()
620

621
# def test_map_view_with_valid_filter_params(self):
622
#     # Create some Rental_Listings objects for testing
623
#     # Replace this with appropriate creation of Rental_Listings objects
624
#     rental_listing_1 = Rental_Listings.objects.create(
625
#         address="123 Main St",
626
#         beds=2,
627
#         baths=2,
628
#         price=2000,
629
#         borough="Brooklyn",
630
#         neighborhood="Park Slope",
631
#         sq_ft=1000,
632
#         Availability_Date="2024-04-03",
633
#         latitude=40.1234,
634
#         longitude=-73.5678,
635
#     )
636
#     rental_listing_2 = Rental_Listings.objects.create(
637
#         address="456 Main St",
638
#         beds=1,
639
#         baths=1,
640
#         price=4000,
641
#         borough="Manhattan",
642
#         neighborhood="Murray Hill",
643
#         sq_ft=1500,
644
#         Availability_Date="2024-04-03",
645
#         latitude=40.6996587,
646
#         longitude=-73.9294536,
647
#     )
648

649
#     # Prepare a request with valid filter_params
650
#     request = self.factory.get(
651
#         "/map/",
652
#         {
653
#             "filter_params": '{"borough": "Manhattan", "min_price": "", "max_price": ""}'
654
#         },
655
#     )
656

657
#     # Call the view function
658
#     response = map_view(request)
659

660
#     # Check if the response status code is 200
661
#     self.assertEqual(response.status_code, 200)
662

663

664
# class ProfileViewEditTestCase(TestCase):
665
#     def setUp(self):
666
#         self.factory = RequestFactory()
667
#         self.user = CustomUser.objects.create_user(
668
#             username='testuser', email='test@example.com', user_type='user' , phone_number = 9876543210, city = 'New York'
669
#         )
670

671
#     def test_profile_view_edit_get(self):
672
#         url = reverse('profile_view_edit')
673
#         request = self.factory.get(url)
674
#         request.user = self.user
675
#         response = profile_view_edit(request)
676
#         self.assertEqual(response.status_code, 200)
677

678
#     def test_profile_view_edit_post(self):
679
#         url = reverse('profile_view_edit')
680
#         data = {'full_name': 'Test User', 'phone_number' :  9876543211, 'city': 'Brooklyn' }
681
#         request = self.factory.post(url, data)
682
#         request.user = self.user
683
#         response = profile_view_edit(request)
684
#         self.assertEqual(response.status_code, 200)  # Check for redirect after successful form submission
685

686
#         updated_user = CustomUser.objects.get(pk=self.user.pk)
687
#         self.assertEqual(updated_user.full_name, 'Test User')
688

689

690
# class LandlordProfileUpdateTestCase(TestCase):
691
#     def setUp(self):
692
#         self.factory = RequestFactory()
693
#         self.user = CustomUser.objects.create_user(
694
#             username='testlandlord', email='landlord@example.com', user_type='landlord', phone_number = 9876543210, city = 'New York'
695
#         )
696

697
#     def test_landlord_profile_update_get(self):
698
#         url = reverse('landlord_profile_update')
699
#         request = self.factory.get(url)
700
#         request.user = self.user
701
#         response = landlord_profile_update(request)
702
#         self.assertEqual(response.status_code, 200)
703

704
#     def test_landlord_profile_update_post(self):
705
#         url = reverse('landlord_profile_update')
706
#         data = {'full_name': 'Test Landlord',  'phone_number'  : 9876543211, 'city' : 'New York'}
707
#         request = self.factory.post(url, data)
708
#         request.user = self.user
709
#         response = landlord_profile_update(request)
710
#         self.assertEqual(response.status_code, 200)  # Check for redirect after successful form submission
711

712
#         updated_user = CustomUser.objects.get(pk=self.user.pk)
713
#         self.assertEqual(updated_user.full_name, 'Test Landlord')
714

715

716
class ProfileUpdateTestCase(TestCase):
1✔
717
    def setUp(self):
1✔
718
        # Create a test user
719
        self.user = CustomUser.objects.create_user(
1✔
720
            username="testuser",
721
            email="test@example.com",
722
            password="testpassword123",
723
            user_type="user",
724
        )
725
        self.client.login(username="testuser", password="testpassword123")
1✔
726

727
    def test_profile_update_form_loads_correctly(self):
1✔
728
        """Test that the profile update form loads with the correct initial data."""
729
        response = self.client.get(reverse("profile_view_edit"))
1✔
730
        self.assertEqual(response.status_code, 200)
1✔
731
        self.assertContains(
1✔
732
            response, 'value="test@example.com"'
733
        )  # Check for pre-filled email
734
        self.assertContains(
1✔
735
            response, 'value="testuser"'
736
        )  # Check for pre-filled username
737

738
    def test_unauthenticated_access_redirects_to_login(self):
1✔
739
        """Test that unauthenticated users are redirected to the login page."""
740
        self.client.logout()  # Log out to test unauthenticated access
1✔
741
        response = self.client.get(reverse("profile_view_edit"))
1✔
742
        self.assertRedirects(
1✔
743
            response, f"/accounts/login/?next={reverse('profile_view_edit')}"
744
        )
745

746
    def test_successful_profile_update(self):
1✔
747
        """Test submitting the form with valid data updates the user's profile."""
748
        data = {
1✔
749
            "full_name": "Test User",
750
            "phone_number": 9876543211,
751
            "city": "New York",
752
        }
753
        response = self.client.post(reverse("profile_view_edit"), data)
1✔
754
        self.assertEqual(response.status_code, 302)
1✔
755
        self.user.refresh_from_db()
1✔
756
        self.assertEqual(self.user.full_name, "Test User")
1✔
757
        messages = [msg.message for msg in get_messages(response.wsgi_request)]
1✔
758
        self.assertIn("Your profile was successfully updated!", messages)
1✔
759

760
    def test_invalid_form_submission(self):
1✔
761
        """Test that invalid form submissions are handled correctly."""
762
        data = {
1✔
763
            "full_name": "",
764
        }
765
        response = self.client.post(reverse("profile_view_edit"), data)
1✔
766
        self.assertEqual(response.status_code, 200)  # Page reloads with form errors
1✔
767
        self.assertFormError(response, "form", "full_name", "This field is required.")
1✔
768

769

770
class LandlordProfileUpdateTestCase(TestCase):
1✔
771
    def setUp(self):
1✔
772
        # Create a test user
773
        self.user = CustomUser.objects.create_user(
1✔
774
            username="testlandlord",
775
            email="test@example.com",
776
            password="testpassword123",
777
            user_type="landlord",
778
        )
779
        self.client.login(username="testlandlord", password="testpassword123")
1✔
780

781
    def test_profile_update_form_loads_correctly(self):
1✔
782
        """Test that the profile update form loads with the correct initial data."""
783
        response = self.client.get(reverse("landlord_profile_update"))
1✔
784
        self.assertEqual(response.status_code, 200)
1✔
785
        self.assertContains(
1✔
786
            response, 'value="test@example.com"'
787
        )  # Check for pre-filled email
788
        self.assertContains(
1✔
789
            response, 'value="testlandlord"'
790
        )  # Check for pre-filled username
791

792
    def test_unauthenticated_access_redirects_to_login(self):
1✔
793
        """Test that unauthenticated users are redirected to the login page."""
794
        self.client.logout()  # Log out to test unauthenticated access
1✔
795
        response = self.client.get(reverse("landlord_profile_update"))
1✔
796
        self.assertRedirects(
1✔
797
            response, f"/accounts/login/?next={reverse('landlord_profile_update')}"
798
        )
799

800
    def test_successful_profile_update(self):
1✔
801
        """Test submitting the form with valid data updates the user's profile."""
802
        data = {
1✔
803
            "full_name": "Test Landlord",
804
            "phone_number": 9876543211,
805
            "city": "New York",
806
        }
807
        response = self.client.post(reverse("landlord_profile_update"), data)
1✔
808
        self.assertEqual(response.status_code, 302)
1✔
809
        self.user.refresh_from_db()
1✔
810
        self.assertEqual(self.user.full_name, "Test Landlord")
1✔
811
        messages = [msg.message for msg in get_messages(response.wsgi_request)]
1✔
812
        self.assertIn("Your profile was successfully updated!", messages)
1✔
813

814
    def test_invalid_form_submission(self):
1✔
815
        """Test that invalid form submissions are handled correctly."""
816
        data = {
1✔
817
            "full_name": "",
818
        }
819
        response = self.client.post(reverse("landlord_profile_update"), data)
1✔
820
        self.assertEqual(response.status_code, 200)  # Page reloads with form errors
1✔
821
        self.assertFormError(response, "form", "full_name", "This field is required.")
1✔
822

823

824
class RentalListingsFormTests(TestCase):
1✔
825
    def setUp(self):
1✔
826
        self.user = CustomUser.objects.create_user(
1✔
827
            username="testuser", email="test@nyu.edu", password="testpass123"
828
        )
829

830
        self.common_data = {
1✔
831
            "address": "123 Main St",
832
            "zipcode": "10001",
833
            "price": 1500,
834
            "sq_ft": 500,
835
            "rooms": 3,
836
            "beds": 2,
837
            "baths": 1.5,
838
            "unit_type": "Apartment",
839
            "neighborhood": "Midtown",
840
            "borough": "Manhattan",
841
            "broker_fee": False,
842
            "central_air_conditioning": True,
843
            "dishwasher": True,
844
            "doorman": False,
845
            "elevator": True,
846
            "furnished": False,
847
            "parking_available": True,
848
            "washer_dryer_in_unit": False,
849
            "Submitted_date": date.today(),
850
            "Availability_Date": date.today() + timedelta(days=10),
851
        }
852

853
    def test_form_with_valid_data(self):
1✔
854
        form = RentalListingForm(data=self.common_data)
1✔
855

856
    def test_form_with_negative_price(self):
1✔
857
        data = self.common_data.copy()
1✔
858
        data["price"] = -100
1✔
859
        form = RentalListingForm(data=data)
1✔
860
        self.assertFalse(form.is_valid())
1✔
861
        self.assertIn("price", form.errors)
1✔
862
        self.assertEqual(form.errors["price"], ["Price cannot be negative."])
1✔
863

864
    def test_form_with_invalid_zipcode(self):
1✔
865
        data = self.common_data.copy()
1✔
866
        data["zipcode"] = "123"
1✔
867
        form = RentalListingForm(data=data)
1✔
868
        self.assertFalse(form.is_valid())
1✔
869
        self.assertIn("zipcode", form.errors)
1✔
870
        self.assertEqual(
1✔
871
            form.errors["zipcode"], ["Please enter a valid 5-digit zip code."]
872
        )
873

874
    def test_form_with_invalid_availability_date(self):
1✔
875
        data = self.common_data.copy()
1✔
876
        data["Availability_Date"] = date.today() - timedelta(days=1)
1✔
877
        form = RentalListingForm(data=data)
1✔
878
        self.assertFalse(form.is_valid())
1✔
879
        self.assertIn("Availability_Date", form.errors)
1✔
880
        self.assertEqual(
1✔
881
            form.errors["Availability_Date"],
882
            ["The availability date cannot be in the past."],
883
        )
884

885
    def test_form_with_rooms_less_than_beds(self):
1✔
886
        data = self.common_data.copy()
1✔
887
        data["rooms"] = 1
1✔
888
        data["beds"] = 2
1✔
889
        form = RentalListingForm(data=data)
1✔
890
        self.assertFalse(form.is_valid())
1✔
891

892
    def test_form_with_large_address(self):
1✔
893
        data = self.common_data.copy()
1✔
894
        data["address"] = "x" * 256
1✔
895
        form = RentalListingForm(data=data)
1✔
896
        self.assertFalse(form.is_valid())
1✔
897

898

899
class TestApplyFilters(TestCase):
1✔
900
    def setUp(self):
1✔
901
        # Creating test listings
902
        self.listing1 = Rental_Listings.objects.create(
1✔
903
            neighborhood="Manhattan",
904
            borough="Manhattan",
905
            price=2000,
906
            beds=2,
907
            baths=1,
908
            elevator=True,
909
            washer_dryer_in_unit=False,
910
            broker_fee=0,
911
            unit_type="Apartment",
912
            address="123 Main Street",
913
        )
914
        self.listing2 = Rental_Listings.objects.create(
1✔
915
            neighborhood="Brooklyn",
916
            borough="Brooklyn",
917
            price=1500,
918
            beds=1,
919
            baths=1,
920
            elevator=False,
921
            washer_dryer_in_unit=True,
922
            broker_fee=500,
923
            unit_type="House",
924
            address="124 Main Street",
925
        )
926
        self.listing3 = Rental_Listings.objects.create(
1✔
927
            neighborhood="Queens",
928
            borough="Queens",
929
            price=1000,
930
            beds=3,
931
            baths=2,
932
            elevator=True,
933
            washer_dryer_in_unit=True,
934
            broker_fee=300,
935
            unit_type="Apartment",
936
            address="125 Main Street",
937
        )
938

939
    def test_filter_by_borough(self):
1✔
940
        filter_params = {"borough": "Manhattan"}
1✔
941
        filtered_listings = apply_filters(Rental_Listings.objects.all(), filter_params)
1✔
942
        self.assertTrue(self.listing1 in filtered_listings)
1✔
943
        self.assertFalse(self.listing2 in filtered_listings)
1✔
944
        self.assertFalse(self.listing3 in filtered_listings)
1✔
945

946
    def test_filter_by_price_range(self):
1✔
947
        filter_params = {"min_price": 1200, "max_price": 2500}
1✔
948
        filtered_listings = apply_filters(Rental_Listings.objects.all(), filter_params)
1✔
949
        self.assertTrue(self.listing1 in filtered_listings)
1✔
950
        self.assertTrue(self.listing2 in filtered_listings)
1✔
951
        self.assertFalse(self.listing3 in filtered_listings)
1✔
952

953
    def test_filter_by_bedrooms(self):
1✔
954
        filter_params = {"bedrooms": "2"}
1✔
955
        filtered_listings = apply_filters(Rental_Listings.objects.all(), filter_params)
1✔
956
        self.assertTrue(self.listing1 in filtered_listings)
1✔
957
        self.assertFalse(self.listing2 in filtered_listings)
1✔
958

959
    def test_filter_by_elevator(self):
1✔
960
        filter_params = {"elevator": True}
1✔
961
        filtered_listings = apply_filters(Rental_Listings.objects.all(), filter_params)
1✔
962
        self.assertTrue(self.listing1 in filtered_listings)
1✔
963
        self.assertFalse(self.listing2 in filtered_listings)
1✔
964
        self.assertTrue(self.listing3 in filtered_listings)
1✔
965

966
    def test_no_filters(self):
1✔
967
        filter_params = {}
1✔
968
        filtered_listings = apply_filters(Rental_Listings.objects.all(), filter_params)
1✔
969
        self.assertEqual(len(filtered_listings), 3)
1✔
970

971
    def test_filter_no_fee(self):
1✔
972
        filter_params = {"no_fee": True}
1✔
973
        filtered_listings = apply_filters(Rental_Listings.objects.all(), filter_params)
1✔
974
        self.assertIn(
1✔
975
            self.listing1, filtered_listings
976
        )  # Assuming listing1 has no broker fee
977
        self.assertNotIn(
1✔
978
            self.listing2, filtered_listings
979
        )  # Assuming listing2 has a broker fee
980

981
    def test_filter_laundry(self):
1✔
982
        filter_params = {"laundry": True}
1✔
983
        filtered_listings = apply_filters(Rental_Listings.objects.all(), filter_params)
1✔
984
        self.assertNotIn(
1✔
985
            self.listing1, filtered_listings
986
        )  # Assuming listing1 does not have laundry
987
        self.assertIn(self.listing2, filtered_listings)  # Assuming listing2 has laundry
1✔
988

989
    def test_filter_building_type(self):
1✔
990
        filter_params = {"building_type": "Apartment"}
1✔
991
        filtered_listings = apply_filters(Rental_Listings.objects.all(), filter_params)
1✔
992
        self.assertIn(self.listing1, filtered_listings)
1✔
993
        self.assertNotIn(self.listing2, filtered_listings)
1✔
994

995
    def test_filter_parking(self):
1✔
996
        filter_params = {"parking": True}
1✔
997
        filtered_listings = apply_filters(Rental_Listings.objects.all(), filter_params)
1✔
998

999
    def test_filter_search_query(self):
1✔
1000
        filter_params = {"search_query": "Main Street"}
1✔
1001
        filtered_listings = apply_filters(Rental_Listings.objects.all(), filter_params)
1✔
1002
        pass
1✔
1003

1004
    def test_filter_bathrooms(self):
1✔
1005
        filter_params = {"bathrooms": "Any"}
1✔
1006
        filtered_listings = apply_filters(Rental_Listings.objects.all(), filter_params)
1✔
1007
        self.assertEqual(len(filtered_listings), Rental_Listings.objects.count())
1✔
1008
        filter_params = {"bathrooms": "1"}
1✔
1009
        filtered_listings = apply_filters(Rental_Listings.objects.all(), filter_params)
1✔
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc