|
1 | | -from datetime import datetime, timedelta |
| 1 | +from datetime import datetime, timedelta, timezone |
2 | 2 | from unittest.mock import Mock, patch |
3 | 3 |
|
4 | 4 | import pytest |
|
8 | 8 | from django.http import HttpResponse |
9 | 9 | from django.test import RequestFactory, TestCase, override_settings |
10 | 10 | from freezegun import freeze_time |
11 | | -from shared.django_apps.codecov_auth.tests.factories import OwnerFactory, UserFactory |
| 11 | +from shared.django_apps.codecov_auth.tests.factories import ( |
| 12 | + OwnerFactory, |
| 13 | + SessionFactory, |
| 14 | + UserFactory, |
| 15 | +) |
12 | 16 | from shared.license import LicenseInformation |
13 | 17 |
|
14 | | -from codecov_auth.models import Owner, OwnerProfile |
| 18 | +from codecov_auth.models import DjangoSession, Owner, OwnerProfile, Session |
| 19 | +from codecov_auth.tests.factories import DjangoSessionFactory |
15 | 20 | from codecov_auth.views.base import LoginMixin, StateMixin |
16 | 21 |
|
17 | 22 |
|
@@ -729,3 +734,118 @@ def test_login_authenticated_with_claimed_owner(self): |
729 | 734 | # does not re-claim owner |
730 | 735 | assert owner.user is not None |
731 | 736 | assert owner.user != user |
| 737 | + |
| 738 | + @patch("services.refresh.RefreshService.trigger_refresh", lambda *args: None) |
| 739 | + def test_login_owner_with_expired_login_session(self): |
| 740 | + user = UserFactory() |
| 741 | + owner = OwnerFactory(service="github", user=user) |
| 742 | + |
| 743 | + another_user = UserFactory() |
| 744 | + another_owner = OwnerFactory(service="github", user=another_user) |
| 745 | + |
| 746 | + now = datetime.now(timezone.utc) |
| 747 | + |
| 748 | + # Create a session that will be deleted |
| 749 | + to_be_deleted_1 = SessionFactory( |
| 750 | + owner=owner, |
| 751 | + type="login", |
| 752 | + name="to_be_deleted", |
| 753 | + lastseen="2021-01-01T00:00:00+00:00", |
| 754 | + login_session=DjangoSessionFactory(expire_date=now - timedelta(days=1)), |
| 755 | + ) |
| 756 | + to_be_deleted_1_session_key = to_be_deleted_1.login_session.session_key |
| 757 | + |
| 758 | + # Create a session that will not be deleted because its not a login session |
| 759 | + to_be_kept_1 = SessionFactory( |
| 760 | + owner=owner, |
| 761 | + type="api", |
| 762 | + name="to_be_kept", |
| 763 | + lastseen="2021-01-01T00:00:00+00:00", |
| 764 | + login_session=DjangoSessionFactory(expire_date=now + timedelta(days=1)), |
| 765 | + ) |
| 766 | + |
| 767 | + # Create a session that will not be deleted because it's not expired |
| 768 | + to_be_kept_2 = SessionFactory( |
| 769 | + owner=owner, |
| 770 | + type="login", |
| 771 | + name="to_be_kept", |
| 772 | + lastseen="2021-01-01T00:00:00+00:00", |
| 773 | + login_session=DjangoSessionFactory(expire_date=now + timedelta(days=1)), |
| 774 | + ) |
| 775 | + |
| 776 | + # Create a session that will not be deleted because it's not the owner's session |
| 777 | + to_be_kept_3 = SessionFactory( |
| 778 | + owner=another_owner, |
| 779 | + type="login", |
| 780 | + name="to_be_kept", |
| 781 | + lastseen="2021-01-01T00:00:00+00:00", |
| 782 | + login_session=DjangoSessionFactory(expire_date=now - timedelta(seconds=1)), |
| 783 | + ) |
| 784 | + |
| 785 | + assert ( |
| 786 | + len(DjangoSession.objects.filter(session_key=to_be_deleted_1_session_key)) |
| 787 | + == 1 |
| 788 | + ) |
| 789 | + assert ( |
| 790 | + len( |
| 791 | + DjangoSession.objects.filter( |
| 792 | + session_key=to_be_kept_1.login_session.session_key |
| 793 | + ) |
| 794 | + ) |
| 795 | + == 1 |
| 796 | + ) |
| 797 | + assert ( |
| 798 | + len( |
| 799 | + DjangoSession.objects.filter( |
| 800 | + session_key=to_be_kept_2.login_session.session_key |
| 801 | + ) |
| 802 | + ) |
| 803 | + == 1 |
| 804 | + ) |
| 805 | + assert ( |
| 806 | + len( |
| 807 | + DjangoSession.objects.filter( |
| 808 | + session_key=to_be_kept_3.login_session.session_key |
| 809 | + ) |
| 810 | + ) |
| 811 | + == 1 |
| 812 | + ) |
| 813 | + |
| 814 | + self.request.user = user |
| 815 | + self.mixin_instance.login_owner(owner, self.request, HttpResponse()) |
| 816 | + owner.refresh_from_db() |
| 817 | + |
| 818 | + new_login_session = Session.objects.filter(name=None) |
| 819 | + |
| 820 | + assert len(new_login_session) == 1 |
| 821 | + assert len(Session.objects.filter(name="to_be_deleted").all()) == 0 |
| 822 | + assert len(Session.objects.filter(name="to_be_kept").all()) == 3 |
| 823 | + |
| 824 | + assert ( |
| 825 | + len(DjangoSession.objects.filter(session_key=to_be_deleted_1_session_key)) |
| 826 | + == 0 |
| 827 | + ) |
| 828 | + assert ( |
| 829 | + len( |
| 830 | + DjangoSession.objects.filter( |
| 831 | + session_key=to_be_kept_1.login_session.session_key |
| 832 | + ) |
| 833 | + ) |
| 834 | + == 1 |
| 835 | + ) |
| 836 | + assert ( |
| 837 | + len( |
| 838 | + DjangoSession.objects.filter( |
| 839 | + session_key=to_be_kept_2.login_session.session_key |
| 840 | + ) |
| 841 | + ) |
| 842 | + == 1 |
| 843 | + ) |
| 844 | + assert ( |
| 845 | + len( |
| 846 | + DjangoSession.objects.filter( |
| 847 | + session_key=to_be_kept_3.login_session.session_key |
| 848 | + ) |
| 849 | + ) |
| 850 | + == 1 |
| 851 | + ) |
0 commit comments