Skip to content

Commit

Permalink
Merge branch 'feature/login-logout' into future/tweet
Browse files Browse the repository at this point in the history
  • Loading branch information
nytsdayo committed Jul 8, 2024
2 parents facc6fe + 617391c commit ad14bf1
Show file tree
Hide file tree
Showing 13 changed files with 327 additions and 51 deletions.
1 change: 0 additions & 1 deletion accounts/admin.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@
# from django.contrib import admin
from django.contrib import admin

from .models import User
Expand Down
13 changes: 4 additions & 9 deletions accounts/forms.py
Original file line number Diff line number Diff line change
@@ -1,21 +1,16 @@
from django.contrib.auth import get_user_model
from django.contrib.auth.forms import AuthenticationForm, UserCreationForm

User = get_user_model() # こっちで先に変数代入する!
User = get_user_model()


class SignupForm(UserCreationForm):
class Meta:
model = User # model = get_user_model() は NG
fields = ("username", "email") # Remove trailing whitespace
model = User
fields = ("username", "email")


class LoginForm(AuthenticationForm):
class Meta:
model = User
fields = ("username", "password") # Remove trailing whitespace


# password1, password2というフィールドはUserCreationFormの方で設定されているため、
# fieldsの欄には、Userモデルの中にある、
# blankにはできない値であるusernameとemailをセットする。
fields = ("username", "password")
16 changes: 16 additions & 0 deletions accounts/migrations/0002_delete_person.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
# Generated by Django 4.2.9 on 2024-02-16 11:46

from django.db import migrations


class Migration(migrations.Migration):

dependencies = [
("accounts", "0001_initial"),
]

operations = [
migrations.DeleteModel(
name="Person",
),
]
17 changes: 0 additions & 17 deletions accounts/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,26 +4,9 @@

class User(AbstractUser):
email = models.EmailField()
# https://github.com/django/django/blob/main/django/contrib/auth/models.py#L405より。
# ここでAUTH_USER_MODELに返すよ!って設定している。

class Meta(AbstractUser.Meta):
swappable = "AUTH_USER_MODEL"


class Person(models.Model):
first_name = models.CharField(max_length=30)
last_name = models.CharField(max_length=30)


# 引数にblank=Falseを入れる必要はない。
# なぜならデフォルトでblank=Falseとなるため。

# from django.contrib.auth.models import AbstractUser
# from django.db import models


# class User(AbstractUser):


# class FriendShip(models.Model):
286 changes: 282 additions & 4 deletions accounts/tests.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,16 +5,294 @@

from tweets.models import Tweet

# from django.conf import settings


User = get_user_model()
Model = Tweet


# class TestSignupView(TestCase):
class TestSignupView(TestCase):
def setUp(self):
self.url = reverse("accounts:signup")

# # Test Case 1
# def test_success_get(self):
# response = self.client.get(self.url)
# self.assertEqual(response.status_code, 200)
# self.assertTemplateUsed(response, "accounts/signup.html")

# Test Case 1-2,2-1
# def test_success_post(self):
# valid_data = {
# "username": "testuser",
# "email": "[email protected]",
# "password1": "testpassword",
# "password2": "testpassword",
# }
# response = self.client.post(self.url, valid_data)
# self.assertRedirects(
# response,
# reverse(settings.LOGIN_REDIRECT_URL), # 2-1
# status_code=302,
# target_status_code=200,
# )
# self.assertTrue(User.objects.filter(username=valid_data["username"]).exists())
# self.assertIn(SESSION_KEY, self.client.session)


# # 異常系test
# # Test Case 3
# def test_failure_post_with_empty_form(self):
# invalid_data = {
# "username": "",
# "email": "",
# "password1": "",
# "password2": "",
# }
# response = self.client.post(self.url, invalid_data)
# form = response.context["form"]

# self.assertEqual(response.status_code, 200)
# self.assertFalse(User.objects.filter(username=invalid_data["username"]).exists())
# self.assertFalse(form.is_valid())
# self.assertIn("このフィールドは必須です。", form.errors["username"])
# self.assertIn("このフィールドは必須です。", form.errors["email"])
# self.assertIn("このフィールドは必須です。", form.errors["password1"])
# self.assertIn("このフィールドは必須です。", form.errors["password2"])

# # Test Case 4
# def test_failure_post_with_empty_username(self):
# print(self.url)
# invalid_data = {
# "username": "",
# "email": "[email protected]",
# "password1": "testpassword",
# "password2": "testpassword",
# }
# response = self.client.post(self.url, invalid_data)
# form = response.context["form"]

# self.assertEqual(response.status_code, 200)
# self.assertFalse(User.objects.filter(username=invalid_data["username"]).exists())
# self.assertFalse(form.is_valid())
# self.assertIn("このフィールドは必須です。", form.errors["username"])

# # Test Case 5
# def test_failure_post_with_empty_email(self):
# invalid_data = {
# "username": "testuser",
# "email": "",
# "password1": "testpassword",
# "password2": "testpassword",
# }
# response = self.client.post(self.url, invalid_data)
# form = response.context["form"]

# self.assertEqual(response.status_code, 200)
# self.assertFalse(User.objects.filter(username=invalid_data["username"]).exists())
# self.assertFalse(form.is_valid())
# self.assertIn("このフィールドは必須です。", form.errors["email"])

# # Test Case 6
# def test_failure_post_with_empty_password(self):
# invalid_data = {
# "username": "testuser",
# "email": "[email protected]",
# "password1": "",
# "password2": "",
# }
# response = self.client.post(self.url, invalid_data)
# form = response.context["form"]

# self.assertEqual(response.status_code, 200)
# # exist error
# self.assertFalse(User.objects.filter(username=invalid_data["username"]).exists())
# # よくわからん
# self.assertFalse(form.is_valid())
# # Error message
# self.assertIn("このフィールドは必須です。", form.errors["password1"])
# self.assertIn("このフィールドは必須です。", form.errors["password2"])

# # Test Case 7
# def test_failure_post_with_duplicated_user(self):
# invalid_data = {
# "username": "tester",
# "email": "[email protected]",
# "password1": "testpassword",
# "password2": "testpassword",
# }
# response = self.client.post(self.url, invalid_data)
# form = response.context["form"]

# self.assertEqual(response.status_code, 200)
# self.assertTrue(User.objects.filter(username=invalid_data["username"]).exists())
# self.assertFalse(form.is_valid())
# self.assertIn("同じユーザー名が既に登録済みです。", form.errors["username"])

# # Test Case 8
# def test_failure_post_with_invalid_email(self):
# invalid_data = {
# "username": "testuser",
# "email": "test",
# "password1": "testpassword",
# "password2": "testpassword",
# }
# response = self.client.post(self.url, invalid_data)
# form = response.context["form"]

# self.assertEqual(response.status_code, 200)
# self.assertFalse(User.objects.filter(username=invalid_data["username"]).exists())
# self.assertFalse(form.is_valid())
# self.assertIn("有効なメールアドレスを入力してください。", form.errors["email"])

# # Test Case 9
# def test_failure_post_with_too_short_password(self):
# invalid_data = {
# "username": "testuser",
# "email": "[email protected]",
# "password1": "aaa",
# "password2": "aaa",
# }
# response = self.client.post(self.url, invalid_data)
# form = response.context["form"]

# self.assertEqual(response.status_code, 200)
# self.assertFalse(User.objects.filter(username=invalid_data["username"]).exists())
# self.assertFalse(form.is_valid())
# self.assertIn("このパスワードは短すぎます。最低 8 文字以上必要です。", form.errors["password2"])

# # Test Case 10
# def test_failure_post_with_password_similar_to_username(self):
# invalid_data = {
# "username": "testuser",
# "email": "[email protected]",
# "password1": "testuser",
# "password2": "testuser",
# }
# response = self.client.post(self.url, invalid_data)
# form = response.context["form"]

# self.assertEqual(response.status_code, 200)
# self.assertFalse(User.objects.filter(username=invalid_data["username"]).exists())
# self.assertFalse(form.is_valid())
# self.assertIn("このパスワードは ユーザー名 と似すぎています。", form.errors["password2"])

# # Test Case 11
# def test_failure_post_with_only_numbers_password(self):
# invalid_data = {
# "username": "testuser",
# "email": "[email protected]",
# "password1": "11111111",
# "password2": "11111111",
# }
# response = self.client.post(self.url, invalid_data)
# form = response.context["form"]

# self.assertEqual(response.status_code, 200)
# self.assertFalse(User.objects.filter(username=invalid_data["username"]).exists())
# self.assertFalse(form.is_valid())
# self.assertIn("このパスワードは数字しか使われていません。", form.errors["password2"])

# # Test Case 12
# def test_failure_post_with_mismatch_password(self):
# invalid_data = {
# "username": "testuser",
# "email": "[email protected]",
# "password1": "testpassword",
# "password2": "testdayo",
# }
# response = self.client.post(self.url, invalid_data)
# form = response.context["form"]

# self.assertEqual(response.status_code, 200)
# self.assertFalse(User.objects.filter(username=invalid_data["username"]).exists())
# self.assertFalse(form.is_valid())
# self.assertIn("確認用パスワードが一致しません。", form.errors["password2"])


# class TestLoginView(TestCase):
# def setUp(self):
# self.url = reverse(settings.LOGIN_URL)
# self.user = User.objects.create_user(
# username="testuser",
# email="[email protected]",
# password="testpassword",
# )

# # Test Case 2-2
# def test_success_get(self):
# response = self.client.get(self.url)
# self.assertEqual(response.status_code, 200)
# self.assertTemplateUsed(response, "accounts/login.html")

# # Test Case 2-3
# def test_success_post(self):
# valid_data = {
# "username": "testuser",
# "password": "testpassword",
# }
# response = self.client.post(self.url, valid_data)

# self.assertRedirects(
# response,
# reverse(settings.LOGIN_REDIRECT_URL),
# status_code=302,
# target_status_code=200,
# )
# self.assertIn(SESSION_KEY, self.client.session)

# # Test Case 2-4
# def test_failure_post_with_not_exists_user(self):
# invalid_data = {
# "username": "testuser2",
# "password": "testpassword",
# }
# response = self.client.post(self.url, invalid_data)
# form = response.context["form"]

# self.assertEqual(response.status_code, 200)
# self.assertFalse(form.is_valid())
# self.assertNotIn(SESSION_KEY, self.client.session)
# self.assertIn(
# "正しいユーザー名とパスワードを入力してください。どちらのフィールドも大文字と小文字は区別されます。",
# form.errors["__all__"],
# )

# # Test Case 2-5
# def test_failure_post_with_empty_password(self):
# invalid_data = {
# "username": "testuser",
# "password": "",
# }
# response = self.client.post(self.url, invalid_data)
# form = response.context["form"]

# self.assertEqual(response.status_code, 200)
# self.assertFalse(form.is_valid())
# self.assertNotIn(SESSION_KEY, self.client.session)
# self.assertIn("このフィールドは必須です。", form.errors["password"])


# class TestLogoutView(TestCase):
# def setUp(self):
# self.url = reverse("accounts:signup")
# self.user = User.objects.create_user(username="tester", password="testpassword")
# self.user = User.objects.create_user(username="testuser", password="testpassword")
# self.client.login(username="testuser", password="testpassword")

# # Test Case 2-6
# def test_success_post(self):
# self.url = reverse("accounts:logout")
# response = self.client.post(self.url)
# self.assertRedirects(
# response,
# reverse(settings.LOGOUT_REDIRECT_URL),
# status_code=302,
# target_status_code=200,
# )
# self.assertNotIn(SESSION_KEY, self.client.session)


# # Test Case 1-1
# class TestUserProfileView(TestCase):
# def test_success_get(self):
# response = self.client.get(self.url)
# self.assertEqual(response.status_code, 200)
Expand Down
3 changes: 1 addition & 2 deletions accounts/urls.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@
from django.conf import settings
from django.contrib.auth import views as auth_views
from django.urls import path

Expand All @@ -9,7 +8,7 @@
urlpatterns = [
path("signup/", views.SignupView.as_view(), name="signup"),
path("login/", auth_views.LoginView.as_view(template_name="accounts/login.html"), name="login"),
path("logout/", auth_views.LogoutView.as_view(next_page=settings.LOGOUT_REDIRECT_URL), name="logout"),
path("logout/", auth_views.LogoutView.as_view(), name="logout"),
path("<str:username>/", views.UserProfileView.as_view(), name="user_profile"),
# path('<str:username>/follow/', views.FollowView.as_view(), name='follow'),
# path('<str:username>/unfollow/', views.UnFollowView, name='unfollow'),
Expand Down
1 change: 0 additions & 1 deletion accounts/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,6 @@ class SignupView(CreateView):
def form_valid(self, form):
response = super().form_valid(form)
username = form.cleaned_data["username"]
# パスワード入力確認処理をしているため
password = form.cleaned_data["password1"]
user = authenticate(self.request, username=username, password=password)
login(self.request, user)
Expand Down
Loading

0 comments on commit ad14bf1

Please sign in to comment.