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

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

24 Apr 2024 12:36AM UTC coverage: 88.975% (+2.2%) from 86.788%
603

cron

travis-pro

web-flow
Merge pull request #163 from gcivil-nyu-org/develop

Merging into master from DEV

199 of 235 new or added lines in 7 files covered. (84.68%)

58 existing lines in 3 files now uncovered.

1033 of 1161 relevant lines covered (88.98%)

0.89 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, \
1✔
15
    apply_filters
1✔
16
from .forms import User, UserSignUpForm
1✔
17
from .models import CustomUser, Rental_Listings
1✔
18
from .views import map_view
19

20

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

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

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

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

44

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

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

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

81

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

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

103

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

109

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

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

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

133

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

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

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

170

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

185

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

193

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

199

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

207

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

213

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

219

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

226

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

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

244

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

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

273

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

291

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

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

1✔
310
    def test_toggle_favorite_remove(self):
311
        Favorite.objects.create(user=self.user, listing=self.listing)
312
        response = self.client.post(self.toggle_favorite_url, {'listing_id': self.listing.id})
313
        self.assertEqual(response.status_code, 200)
1✔
314
        self.assertEqual(Favorite.objects.count(), 0)
1✔
315
        self.assertJSONEqual(str(response.content, encoding='utf8'), {"status": "removed"})
1✔
316

317
    def test_toggle_favorite_with_invalid_listing(self):
318
        response = self.client.post(self.toggle_favorite_url, {'listing_id': 9999})  # Assuming 9999 is an invalid ID
1✔
319
        self.assertEqual(response.status_code, 404)
1✔
320
        self.assertJSONEqual(str(response.content, encoding='utf8'), {"error": "Listing not found"})
1✔
321

322
    def test_toggle_favorite_without_listing_id(self):
323
        response = self.client.post(self.toggle_favorite_url, {})
324
        self.assertEqual(response.status_code, 400)
1✔
325
        self.assertJSONEqual(str(response.content, encoding='utf8'), {"error": "Listing ID is required"})
1✔
326

327

328
class LogoutViewTests(TestCase):
1✔
329
    def test_logout(self):
1✔
330
        self.client.login(username="testuser", password="testpass123")
331
        response = self.client.get(reverse("logout"))
332
        self.assertRedirects(response, "/")
333

1✔
334

1✔
335
class HomeViewTests(TestCase):
1✔
336
    def test_home_view_status_code(self):
1✔
337
        response = self.client.get(reverse("index"))
338
        self.assertEqual(response.status_code, 200)
339

340

341
# class UserHomeViewTests(TestCase):
1✔
342
#     def test_user_home_redirect_for_anonymous(self):
1✔
343
#         response = self.client.get(reverse('user_homepage'), follow=True)
1✔
344
#         self.assertRedirects(response, '/login/user_login?next=/user/home/')
1✔
345

1✔
346
# class LandlordHomeViewTests(TestCase):
347
#     def test_landlord_home_redirect_for_anonymous(self):
348
#         response = self.client.get(reverse('landlord_homepage'), follow=True)
1✔
349
#         self.assertRedirects(response, '/login/landlord_login?next=/landlord/home/')
1✔
350

1✔
351

1✔
352
class RentalsPageViewTests(TestCase):
353
    def test_rentals_page_for_user(self):
354
        self.client.login(username="testuser", password="testpass123")
355
        response = self.client.get(reverse("rentalspage"))
356
        self.assertEqual(response.status_code, 302)
357

358

359
# class FavoritesPageViewTests(TestCase):
360
#     def test_favorites_page_for_user(self):
361
#         self.client.login(username='testuser', password='testpass123')  # Make sure the user is logged in
362
#         response = self.client.get(reverse('favorites_page'))
363
#         self.assertEqual(response.status_code, 200)
364

365

1✔
366
class UserSignUpViewTests(TestCase):
1✔
367
    def test_user_signup_with_invalid_data(self):
1✔
368
        response = self.client.post(reverse("user_signup"), {})
1✔
369
        self.assertEqual(response.status_code, 200)
1✔
370
        self.assertTrue(response.context["form"].errors)
371

372

373
class LandlordSignUpViewTests(TestCase):
374
    def test_landlord_signup_with_valid_data(self):
375
        form_data = {
376
            "username": "newlandlord",
377
            "email": "newlandlord@nyu.edu",
378
            "password1": "landlordpassword123",
379
            "password2": "landlordpassword123",
1✔
380
            "full_name": "New Landlord",
1✔
381
            "phone_number": "1234567890",
1✔
382
            "city": "New York City",
1✔
383
        }
1✔
384
        response = self.client.post(reverse("landlord_signup"), form_data)
385
        self.assertRedirects(response, reverse("landlord_login"))
386
        self.assertEqual(
1✔
387
            CustomUser.objects.filter(user_type=CustomUser.LANDLORD).count(), 1
1✔
388
        )
1✔
389

390

391
class UserLoginViewTests(TestCase):
392
    def test_user_login_redirect(self):
393
        user = CustomUser.objects.create_user(
394
            username="loginuser", email="loginuser@nyu.edu", password="password"
395
        )
396
        response = self.client.post(
397
            reverse("user_login"), {"username": "loginuser", "password": "password"}
1✔
398
        )
1✔
399
        self.assertRedirects(response, reverse("user_homepage"))
1✔
400

401

402
# class UserHomePageViewTests(TestCase):
403
#     def test_user_homepage_access_unauthenticated(self):
404
#         response = self.client.get(reverse("user_homepage"))
1✔
405
#         self.assertEqual(response.status_code, 302)
1✔
406
#         self.assertTrue(reverse("user_login") in response.url)
1✔
407

408

409
class UserHomePageAuthenticatedAccessTests(TestCase):
1✔
410
    def test_user_homepage_access_authenticated(self):
411
        user = CustomUser.objects.create_user(
412
            username="testuserhome", email="testuserhome@nyu.edu", password="password"
1✔
413
        )
414
        self.client.login(username="testuserhome", password="password")
415
        response = self.client.get(reverse("user_homepage"))
416
        self.assertEqual(response.status_code, 200)
417

418

419
class LogoutFunctionalityTests(TestCase):
420
    def test_logout_redirects_to_home(self):
421
        self.client.login(username="testuser", password="testpass123")
422
        response = self.client.get(reverse("logout"))
1✔
423
        self.assertRedirects(response, reverse("index"))
1✔
424

1✔
425

426
class RentalListingsAccessTests(TestCase):
427
    def test_rental_listings_access_by_authenticated_user(self):
1✔
428
        self.client.login(username="testuser", password="testpass123")
1✔
429
        response = self.client.get(reverse("rentalspage"))
1✔
430
        self.assertEqual(response.status_code, 302)
431

432

1✔
433
class LandlordSignupWithFileTest(TestCase):
1✔
434
    @patch("users.views.boto3.client")
1✔
435
    def test_landlord_signup_with_file(self, mock_boto3_client):
1✔
436
        mock_s3_client = mock_boto3_client.return_value
1✔
437
        mock_s3_client.upload_fileobj.return_value = None  # Simulate successful upload
438

439
        form_data = {
1✔
440
            "username": "landlordfile@nyu.edu",
1✔
441
            "email": "landlordfile@nyu.edu",
1✔
442
            "password1": "landlordpassword",
1✔
443
            "password2": "landlordpassword",
1✔
444
            "full_name": "Landlord File",
445
            "phone_number": "9876543210",
446
            "city": "New York",
1✔
447
            "pdf_file": SimpleUploadedFile(
1✔
448
                "test_file.pdf",
1✔
449
                b"These are the file contents.",
1✔
450
                content_type="application/pdf",
1✔
451
            ),
452
        }
1✔
453
        response = self.client.post(reverse("landlord_signup"), form_data)
454
        self.assertRedirects(response, reverse("landlord_login"))
455
        self.assertTrue(
456
            CustomUser.objects.filter(email="landlordfile@nyu.edu").exists()
457
        )
458

459

460
class UserLoginRedirectTest(TestCase):
461
    @classmethod
462
    def setUpTestData(cls):
463
        cls.user = CustomUser.objects.create_user(
464
            username="testuserredirect",
465
            email="userredirect@nyu.edu",
466
            password="password123",
1✔
467
            user_type=CustomUser.USER,
1✔
468
        )
1✔
469

470
    def test_user_login_redirect_to_user_homepage(self):
471
        self.client.login(username="testuserredirect", password="password123")
472
        response = self.client.get(reverse("user_homepage"))
473
        self.assertEqual(response.status_code, 200)
1✔
474

1✔
475

1✔
476
class Custom404HandlerTest(TestCase):
1✔
477
    def test_404_redirect_for_anonymous_user(self):
478
        response = self.client.get("/thispagedoesnotexist")
479
        self.assertRedirects(response, reverse("index"))
480

481
    def test_404_redirect_for_authenticated_user(self):
482
        user = CustomUser.objects.create_user(
483
            username="user404test", password="password"
1✔
484
        )
1✔
485
        self.client.login(username="user404test", password="password")
1✔
486
        response = self.client.get("/thispagedoesnotexist")
1✔
487
        self.assertRedirects(response, reverse("user_homepage"))
488

489

1✔
490
class ToggleFavoriteTest(TestCase):
1✔
491
    @classmethod
1✔
492
    def setUpTestData(cls):
1✔
493
        cls.user = CustomUser.objects.create_user(
494
            username="favuser",
1✔
495
            email="favuser@nyu.edu",
1✔
496
            password="testpass123",
497
            user_type=CustomUser.USER,
498
        )
1✔
499
        cls.listing = Rental_Listings.objects.create(
1✔
500
            address="123 Fav St", price=1500.00, baths=1, Landlord=cls.user
1✔
501
        )
502

503
    # def test_toggle_favorite_add(self):
1✔
504
    #     self.client.login(username='favuser', password='testpass123')
1✔
505
    #     response = self.client.post(reverse('toggle_favorite'), json.dumps({'listing_id': self.listing.id}), content_type='application/json')
1✔
UNCOV
506
    #     self.assertEqual(response.status_code, 400)
×
507
    #     self.assertTrue(Favorite.objects.filter(user=self.user, listing=self.listing).exists())
508

509

510
class LandlordUserPageAccessTest(TestCase):
511
    @classmethod
UNCOV
512
    def setUpTestData(cls):
×
513
        cls.landlord_user = CustomUser.objects.create_user(
514
            username="landlorduser",
515
            email="landlorduser@nyu.edu",
516
            password="testpass123",
517
            user_type=CustomUser.LANDLORD,
518
        )
519
        cls.user = CustomUser.objects.create_user(
520
            username="normaluser",
521
            email="normaluser@nyu.edu",
522
            password="testpass123",
523
            user_type=CustomUser.USER,
1✔
524
        )
1✔
525

1✔
526
    def test_landlord_accessing_user_page(self):
1✔
527
        self.client.login(username="landlorduser", password="testpass123")
528
        response = self.client.get(reverse("user_homepage"))
529
        self.assertNotEqual(response.status_code, 200)
530

531
    def test_user_accessing_landlord_page(self):
532
        self.client.login(username="normaluser", password="testpass123")
1✔
533
        response = self.client.get(reverse("landlord_homepage"))
534
        self.assertNotEqual(response.status_code, 200)
535

536

537
class ListingDetailViewTest(TestCase):
538
    def setUp(self):
539
        self.client = Client()
1✔
540
        self.user = User.objects.create_user(username="testuser", password="password")
1✔
541
        self.client.login(username="testuser", password="password")
1✔
542

1✔
543
        self.listing = Rental_Listings.objects.create(
544
            address="123 Main St",
1✔
545
            beds=2,
1✔
546
            baths=2,
1✔
547
            price=2000,
1✔
548
            borough="Brooklyn",
549
            neighborhood="Park Slope",
550
            sq_ft=1000,
1✔
551
            Availability_Date="2024-04-03",
1✔
552
            latitude=40.1234,
1✔
553
            longitude=-73.5678,
1✔
554
        )
1✔
555

556
    # def test_listing_detail_view(self):
1✔
557
    #     response = self.client.get(
558
    #         reverse("listing_detail", kwargs={"listing_id": self.listing.pk})
559
    #     )
560
    #     self.assertEqual(response.status_code, 200)
561
    #     self.assertContains(response, self.listing.address)
562
    #     self.assertContains(response, self.listing.beds)
563
    #     self.assertContains(response, self.listing.baths)
564

565
    def test_toggle_favorite_ajax(self):
566
        response = self.client.post(
567
            reverse("toggle_favorite"), {"listing_id": self.listing.pk}
568
        )
569
        self.assertEqual(response.status_code, 200)
570

571
    def test_listing_detail_not_found(self):
572
        non_existent_listing_id = 99999  # Assuming this ID does not exist
573
        response = self.client.get(
574
            reverse("listing_detail", kwargs={"listing_id": non_existent_listing_id})
575
        )
576
        self.assertEqual(response.status_code, 302)
577

578

1✔
579
# class InitTestCase(TestCase):
1✔
580
#     def test_default_settings(self):
581
#         # Do not set ENV_NAME or set it to a value other than "prod" or "develop"
582
#         from rent_wise_nyc import settings
1✔
583
#         # Assert that settings imported from local.py are correctly applied
584
#         self.assertEqual(settings.ALLOWED_HOSTS, ["127.0.0.1"])
1✔
585

1✔
586

1✔
587
class ManagePyTestCase(unittest.TestCase):
588
    @patch.dict(os.environ, {"DJANGO_SETTINGS_MODULE": "rent_wise_nyc.settings"})
589
    @patch("django.core.management.execute_from_command_line")
1✔
590
    def test_main_success(self, mock_execute_from_command_line):
591
        from manage import main
592

593
        main()
594
        mock_execute_from_command_line.assert_called_once_with(sys.argv)
595

596
    @patch("django.core.management.execute_from_command_line", side_effect=ImportError)
597
    def test_main_import_error(self, mock_execute_from_command_line):
598
        from manage import main
599

600
        with self.assertRaises(ImportError):
1✔
601
            main()
1✔
602

1✔
603

1✔
604
# class MapViewTestCase(TestCase):
1✔
605
#     def setUp(self):
606
#         self.factory = RequestFactory()
1✔
607

1✔
608
# def test_map_view_with_valid_filter_params(self):
609
#     # Create some Rental_Listings objects for testing
1✔
610
#     # Replace this with appropriate creation of Rental_Listings objects
1✔
611
#     rental_listing_1 = Rental_Listings.objects.create(
1✔
612
#         address="123 Main St",
613
#         beds=2,
1✔
614
#         baths=2,
1✔
615
#         price=2000,
616
#         borough="Brooklyn",
617
#         neighborhood="Park Slope",
618
#         sq_ft=1000,
619
#         Availability_Date="2024-04-03",
620
#         latitude=40.1234,
621
#         longitude=-73.5678,
622
#     )
623
#     rental_listing_2 = Rental_Listings.objects.create(
624
#         address="456 Main St",
625
#         beds=1,
626
#         baths=1,
627
#         price=4000,
628
#         borough="Manhattan",
629
#         neighborhood="Murray Hill",
630
#         sq_ft=1500,
631
#         Availability_Date="2024-04-03",
632
#         latitude=40.6996587,
633
#         longitude=-73.9294536,
634
#     )
635

636
#     # Prepare a request with valid filter_params
637
#     request = self.factory.get(
638
#         "/map/",
639
#         {
640
#             "filter_params": '{"borough": "Manhattan", "min_price": "", "max_price": ""}'
641
#         },
642
#     )
643

644
#     # Call the view function
645
#     response = map_view(request)
646

647
#     # Check if the response status code is 200
648
#     self.assertEqual(response.status_code, 200)
649

650

651
# class ProfileViewEditTestCase(TestCase):
652
#     def setUp(self):
653
#         self.factory = RequestFactory()
654
#         self.user = CustomUser.objects.create_user(
655
#             username='testuser', email='test@example.com', user_type='user' , phone_number = 9876543210, city = 'New York'
656
#         )
657

658
#     def test_profile_view_edit_get(self):
659
#         url = reverse('profile_view_edit')
660
#         request = self.factory.get(url)
661
#         request.user = self.user
662
#         response = profile_view_edit(request)
663
#         self.assertEqual(response.status_code, 200)
664

665
#     def test_profile_view_edit_post(self):
666
#         url = reverse('profile_view_edit')
667
#         data = {'full_name': 'Test User', 'phone_number' :  9876543211, 'city': 'Brooklyn' }
668
#         request = self.factory.post(url, data)
669
#         request.user = self.user
670
#         response = profile_view_edit(request)
671
#         self.assertEqual(response.status_code, 200)  # Check for redirect after successful form submission
672

673
#         updated_user = CustomUser.objects.get(pk=self.user.pk)
674
#         self.assertEqual(updated_user.full_name, 'Test User')
675

676

677
# class LandlordProfileUpdateTestCase(TestCase):
678
#     def setUp(self):
679
#         self.factory = RequestFactory()
680
#         self.user = CustomUser.objects.create_user(
681
#             username='testlandlord', email='landlord@example.com', user_type='landlord', phone_number = 9876543210, city = 'New York'
682
#         )
683

684
#     def test_landlord_profile_update_get(self):
685
#         url = reverse('landlord_profile_update')
686
#         request = self.factory.get(url)
687
#         request.user = self.user
688
#         response = landlord_profile_update(request)
689
#         self.assertEqual(response.status_code, 200)
690

691
#     def test_landlord_profile_update_post(self):
692
#         url = reverse('landlord_profile_update')
693
#         data = {'full_name': 'Test Landlord',  'phone_number'  : 9876543211, 'city' : 'New York'}
694
#         request = self.factory.post(url, data)
695
#         request.user = self.user
696
#         response = landlord_profile_update(request)
697
#         self.assertEqual(response.status_code, 200)  # Check for redirect after successful form submission
698

699
#         updated_user = CustomUser.objects.get(pk=self.user.pk)
700
#         self.assertEqual(updated_user.full_name, 'Test Landlord')
701

702

703
class ProfileUpdateTestCase(TestCase):
704
    def setUp(self):
705
        # Create a test user
706
        self.user = CustomUser.objects.create_user(
707
            username="testuser",
708
            email="test@example.com",
709
            password="testpassword123",
710
            user_type="user",
711
        )
712
        self.client.login(username="testuser", password="testpassword123")
713

714
    def test_profile_update_form_loads_correctly(self):
715
        """Test that the profile update form loads with the correct initial data."""
716
        response = self.client.get(reverse("profile_view_edit"))
1✔
717
        self.assertEqual(response.status_code, 200)
1✔
718
        self.assertContains(
719
            response, 'value="test@example.com"'
1✔
720
        )  # Check for pre-filled email
721
        self.assertContains(
722
            response, 'value="testuser"'
723
        )  # Check for pre-filled username
724

725
    def test_unauthenticated_access_redirects_to_login(self):
1✔
726
        """Test that unauthenticated users are redirected to the login page."""
727
        self.client.logout()  # Log out to test unauthenticated access
1✔
728
        response = self.client.get(reverse("profile_view_edit"))
729
        self.assertRedirects(
1✔
730
            response, f"/accounts/login/?next={reverse('profile_view_edit')}"
1✔
731
        )
1✔
732

733
    def test_successful_profile_update(self):
734
        """Test submitting the form with valid data updates the user's profile."""
1✔
735
        data = {
736
            "full_name": "Test User",
737
            "phone_number": 9876543211,
738
            "city": "New York",
1✔
739
        }
740
        response = self.client.post(reverse("profile_view_edit"), data)
1✔
741
        self.assertEqual(response.status_code, 302)
1✔
742
        self.user.refresh_from_db()
1✔
743
        self.assertEqual(self.user.full_name, "Test User")
744
        messages = [msg.message for msg in get_messages(response.wsgi_request)]
745
        self.assertIn("Your profile was successfully updated!", messages)
746

1✔
747
    def test_invalid_form_submission(self):
748
        """Test that invalid form submissions are handled correctly."""
1✔
749
        data = {
750
            "full_name": "",
751
        }
752
        response = self.client.post(reverse("profile_view_edit"), data)
753
        self.assertEqual(response.status_code, 200)  # Page reloads with form errors
1✔
754
        self.assertFormError(response, "form", "full_name", "This field is required.")
1✔
755

1✔
756

1✔
757
class LandlordProfileUpdateTestCase(TestCase):
1✔
758
    def setUp(self):
1✔
759
        # Create a test user
760
        self.user = CustomUser.objects.create_user(
1✔
761
            username="testlandlord",
762
            email="test@example.com",
1✔
763
            password="testpassword123",
764
            user_type="landlord",
765
        )
1✔
766
        self.client.login(username="testlandlord", password="testpassword123")
1✔
767

1✔
768
    def test_profile_update_form_loads_correctly(self):
769
        """Test that the profile update form loads with the correct initial data."""
770
        response = self.client.get(reverse("landlord_profile_update"))
1✔
771
        self.assertEqual(response.status_code, 200)
1✔
772
        self.assertContains(
773
            response, 'value="test@example.com"'
1✔
774
        )  # Check for pre-filled email
775
        self.assertContains(
776
            response, 'value="testlandlord"'
777
        )  # Check for pre-filled username
778

779
    def test_unauthenticated_access_redirects_to_login(self):
1✔
780
        """Test that unauthenticated users are redirected to the login page."""
781
        self.client.logout()  # Log out to test unauthenticated access
1✔
782
        response = self.client.get(reverse("landlord_profile_update"))
783
        self.assertRedirects(
1✔
784
            response, f"/accounts/login/?next={reverse('landlord_profile_update')}"
1✔
785
        )
1✔
786

787
    def test_successful_profile_update(self):
788
        """Test submitting the form with valid data updates the user's profile."""
1✔
789
        data = {
790
            "full_name": "Test Landlord",
791
            "phone_number": 9876543211,
792
            "city": "New York",
1✔
793
        }
794
        response = self.client.post(reverse("landlord_profile_update"), data)
1✔
795
        self.assertEqual(response.status_code, 302)
1✔
796
        self.user.refresh_from_db()
1✔
797
        self.assertEqual(self.user.full_name, "Test Landlord")
798
        messages = [msg.message for msg in get_messages(response.wsgi_request)]
799
        self.assertIn("Your profile was successfully updated!", messages)
800

1✔
801
    def test_invalid_form_submission(self):
802
        """Test that invalid form submissions are handled correctly."""
1✔
803
        data = {
804
            "full_name": "",
805
        }
806
        response = self.client.post(reverse("landlord_profile_update"), data)
807
        self.assertEqual(response.status_code, 200)  # Page reloads with form errors
1✔
808
        self.assertFormError(response, "form", "full_name", "This field is required.")
1✔
809

1✔
810
class RentalListingsFormTests(TestCase):
1✔
811
    def setUp(self):
1✔
812
        self.user = CustomUser.objects.create_user(
1✔
813
            username="testuser", email="test@nyu.edu", password="testpass123"
814
        )
1✔
815

816
        self.common_data = {
1✔
817
            'address': "123 Main St",
818
            'zipcode': "10001",
819
            'price': 1500,
1✔
820
            'sq_ft': 500,
1✔
821
            'rooms': 3,
1✔
822
            'beds': 2,
823
            'baths': 1.5,
824
            'unit_type': "Apartment",
1✔
825
            'neighborhood': "Midtown",
1✔
826
            'borough': "Manhattan",
1✔
827
            'broker_fee': False,
828
            'central_air_conditioning': True,
829
            'dishwasher': True,
830
            'doorman': False,
1✔
831
            'elevator': True,
832
            'furnished': False,
833
            'parking_available': True,
834
            'washer_dryer_in_unit': False,
835
            'Submitted_date': date.today(),
836
            'Availability_Date': date.today() + timedelta(days=10)
837
        }
838

839
    def test_form_with_valid_data(self):
840
        form = RentalListingForm(data=self.common_data)
841

842
    def test_form_with_negative_price(self):
843
        data = self.common_data.copy()
844
        data['price'] = -100
845
        form = RentalListingForm(data=data)
846
        self.assertFalse(form.is_valid())
847
        self.assertIn('price', form.errors)
848
        self.assertEqual(form.errors['price'], ['Price cannot be negative.'])
849

850
    def test_form_with_invalid_zipcode(self):
851
        data = self.common_data.copy()
852
        data['zipcode'] = '123'
853
        form = RentalListingForm(data=data)
1✔
854
        self.assertFalse(form.is_valid())
1✔
855
        self.assertIn('zipcode', form.errors)
856
        self.assertEqual(form.errors['zipcode'], ['Please enter a valid 5-digit zip code.'])
1✔
857

1✔
858
    def test_form_with_invalid_availability_date(self):
1✔
859
        data = self.common_data.copy()
1✔
860
        data['Availability_Date'] = date.today() - timedelta(days=1)
1✔
861
        form = RentalListingForm(data=data)
1✔
862
        self.assertFalse(form.is_valid())
1✔
863
        self.assertIn('Availability_Date', form.errors)
864
        self.assertEqual(form.errors['Availability_Date'], ['The availability date cannot be in the past.'])
1✔
865

1✔
866
    def test_form_with_rooms_less_than_beds(self):
1✔
867
        data = self.common_data.copy()
1✔
868
        data['rooms'] = 1
1✔
869
        data['beds'] = 2
1✔
870
        form = RentalListingForm(data=data)
1✔
871
        self.assertFalse(form.is_valid())
872

873
    def test_form_with_large_address(self):
874
        data = self.common_data.copy()
1✔
875
        data['address'] = 'x' * 256
1✔
876
        form = RentalListingForm(data=data)
1✔
877
        self.assertFalse(form.is_valid())
1✔
878

1✔
879

1✔
880
class TestApplyFilters(TestCase):
1✔
881
    def setUp(self):
882
        # Creating test listings
883
        self.listing1 = Rental_Listings.objects.create(
884
            neighborhood='Manhattan', borough='Manhattan', price=2000,
885
            beds=2, baths=1, elevator=True, washer_dryer_in_unit=False,
1✔
886
            broker_fee=0, unit_type='Apartment', address='123 Main Street'
1✔
887
        )
1✔
888
        self.listing2 = Rental_Listings.objects.create(
1✔
889
            neighborhood='Brooklyn', borough='Brooklyn', price=1500,
1✔
890
            beds=1, baths=1, elevator=False, washer_dryer_in_unit=True,
1✔
891
            broker_fee=500, unit_type='House', address='124 Main Street'
892
        )
1✔
893
        self.listing3 = Rental_Listings.objects.create(
1✔
894
            neighborhood='Queens', borough='Queens', price=1000,
1✔
895
            beds=3, baths=2, elevator=True, washer_dryer_in_unit=True,
1✔
896
            broker_fee=300, unit_type='Apartment', address='125 Main Street'
1✔
897
        )
898

899
    def test_filter_by_borough(self):
1✔
900
        filter_params = {'borough': 'Manhattan'}
1✔
901
        filtered_listings = apply_filters(Rental_Listings.objects.all(), filter_params)
902
        self.assertTrue(self.listing1 in filtered_listings)
1✔
903
        self.assertFalse(self.listing2 in filtered_listings)
904
        self.assertFalse(self.listing3 in filtered_listings)
905

906
    def test_filter_by_price_range(self):
907
        filter_params = {'min_price': 1200, 'max_price': 2500}
908
        filtered_listings = apply_filters(Rental_Listings.objects.all(), filter_params)
909
        self.assertTrue(self.listing1 in filtered_listings)
910
        self.assertTrue(self.listing2 in filtered_listings)
911
        self.assertFalse(self.listing3 in filtered_listings)
912

913
    def test_filter_by_bedrooms(self):
914
        filter_params = {'bedrooms': '2'}
1✔
915
        filtered_listings = apply_filters(Rental_Listings.objects.all(), filter_params)
916
        self.assertTrue(self.listing1 in filtered_listings)
917
        self.assertFalse(self.listing2 in filtered_listings)
918

919
    def test_filter_by_elevator(self):
920
        filter_params = {'elevator': True}
921
        filtered_listings = apply_filters(Rental_Listings.objects.all(), filter_params)
922
        self.assertTrue(self.listing1 in filtered_listings)
923
        self.assertFalse(self.listing2 in filtered_listings)
924
        self.assertTrue(self.listing3 in filtered_listings)
925

926
    def test_no_filters(self):
1✔
927
        filter_params = {}
928
        filtered_listings = apply_filters(Rental_Listings.objects.all(), filter_params)
929
        self.assertEqual(len(filtered_listings), 3)
930

931
    def test_filter_no_fee(self):
932
        filter_params = {'no_fee': True}
933
        filtered_listings = apply_filters(Rental_Listings.objects.all(), filter_params)
934
        self.assertIn(self.listing1, filtered_listings)  # Assuming listing1 has no broker fee
935
        self.assertNotIn(self.listing2, filtered_listings)  # Assuming listing2 has a broker fee
936

937
    def test_filter_laundry(self):
938
        filter_params = {'laundry': True}
939
        filtered_listings = apply_filters(Rental_Listings.objects.all(), filter_params)
1✔
940
        self.assertNotIn(self.listing1, filtered_listings)  # Assuming listing1 does not have laundry
1✔
941
        self.assertIn(self.listing2, filtered_listings)  # Assuming listing2 has laundry
1✔
942

1✔
943
    def test_filter_building_type(self):
1✔
944
        filter_params = {'building_type': 'Apartment'}
1✔
945
        filtered_listings = apply_filters(Rental_Listings.objects.all(), filter_params)
946
        self.assertIn(self.listing1, filtered_listings)
1✔
947
        self.assertNotIn(self.listing2, filtered_listings)
1✔
948

1✔
949
    def test_filter_parking(self):
1✔
950
        filter_params = {'parking': True}
1✔
951
        filtered_listings = apply_filters(Rental_Listings.objects.all(), filter_params)
1✔
952

953
    def test_filter_search_query(self):
1✔
954
        filter_params = {'search_query': 'Main Street'}
1✔
955
        filtered_listings = apply_filters(Rental_Listings.objects.all(), filter_params)
1✔
956
        pass
1✔
957

1✔
958
    def test_filter_bathrooms(self):
959
        filter_params = {'bathrooms': 'Any'}
1✔
960
        filtered_listings = apply_filters(Rental_Listings.objects.all(), filter_params)
1✔
961
        self.assertEqual(len(filtered_listings), Rental_Listings.objects.count())
1✔
962
        filter_params = {'bathrooms': '1'}
1✔
963
        filtered_listings = apply_filters(Rental_Listings.objects.all(), filter_params)
1✔
964

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