Advertisement
matacoder

Untitled

Sep 11th, 2020
99
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 12.74 KB | None | 0 0
  1. from django.contrib.auth import get_user_model
  2. from django.core.cache import cache
  3. from django.core.files.uploadedfile import SimpleUploadedFile
  4. from django.shortcuts import reverse
  5. from django.test import Client, TestCase
  6.  
  7. from .models import Comment, Follow, Group, Post
  8.  
  9. User = get_user_model()
  10.  
  11.  
  12. class TestPostsAndLogin(TestCase):
  13.     def setUp(self):
  14.         """ Preparing test enviroment """
  15.         self.client = Client()
  16.         self.client_unauthorized = Client()
  17.         # create user
  18.         self.user = User.objects.create_user(
  19.             username="sarah", email="connor.s@skynet.com", password="12345"
  20.         )
  21.         # create follow user
  22.         self.author = User.objects.create_user(
  23.             username="skynet", email="admin@skynet.com", password="12345"
  24.         )
  25.         # create group
  26.         self.testgroup = Group.objects.create(
  27.             title="Test Group",
  28.             slug="group",
  29.             description="Testing Around",
  30.         )
  31.         self.testgroup2 = Group.objects.create(
  32.             title="Test Group 2",
  33.             slug="group2",
  34.             description="Testing Around 2",
  35.         )
  36.         # create post
  37.         self.post = Post.objects.create(
  38.             text=("Youre talking about things I havent"
  39.                   " done yet in the past tense. Its driving me crazy!"),
  40.             author=self.user,
  41.             group=self.testgroup
  42.         )
  43.  
  44.         # login
  45.         self.client.force_login(self.user, backend=None)
  46.         cache.clear()
  47.  
  48.     def test_post_with_image(self):
  49.         """ Post with image is added """
  50.         small_gif = (
  51.             b"\x47\x49\x46\x38\x39\x61\x01\x00\x01\x00\x00\x00\x00\x21\xf9\x04"
  52.             b"\x01\x0a\x00\x01\x00\x2c\x00\x00\x00\x00\x01\x00\x01\x00\x00\x02"
  53.             b"\x02\x4c\x01\x00\x3b"
  54.         )
  55.         img = SimpleUploadedFile(
  56.             "small.gif",
  57.             small_gif,
  58.             content_type="image/gif"
  59.         )
  60.         url = reverse("new_post")
  61.         data = {
  62.             "text": "Abracadabra with image",
  63.             "group": self.testgroup.id,
  64.             "image": img
  65.         }
  66.         response = self.client.post(url, data=data, follow=True)
  67.         self.assertEqual(response.status_code, 200)
  68.         urls = self.generate_urls()
  69.         for url in urls:
  70.             response = self.client.get(url)
  71.             self.assertIn("<img".encode(), response.content)
  72.  
  73.     def test_non_img_file(self):
  74.         """ Test uploading non-image file """
  75.         wrong_file = (
  76.             b"\x01\x0a\x00\x01\x00\x2c\x00\x00\x00\x00\x01\x00\x01\x00\x00\x02"
  77.             b"\x02\x4c\x01\x00\x3b"
  78.         )
  79.         wrong = SimpleUploadedFile(
  80.             "wrong_file.doc",
  81.             wrong_file,
  82.             content_type="doc"
  83.         )
  84.         url = reverse("new_post")
  85.         data = {
  86.             "text": "Abracadabra with non-image",
  87.             "group": self.testgroup.id,
  88.             "image": wrong
  89.         }
  90.         response = self.client.post(url, data=data)
  91.         self.assertFormError(
  92.             response,
  93.             form="form",
  94.             field="image",
  95.             errors="Загрузите правильное изображение. Файл, "
  96.                    "который вы загрузили, поврежден или не "
  97.                    "является изображением.")
  98.  
  99.     def generate_urls(self):
  100.         lastpost = Post.objects.latest("pub_date")
  101.         index = reverse("index")
  102.         profile = reverse("profile", args=[self.user.username])
  103.         post = reverse("post_single", args=[self.user.username, lastpost.pk])
  104.         group = reverse("group_url", args=[self.testgroup.slug])
  105.         return [index, profile, post, group]
  106.  
  107.     def test_register_url(self):
  108.         """ Test user profile """
  109.         response = self.client.get(
  110.             reverse("profile", args=[self.user.username])
  111.         )
  112.         self.assertEqual(response.status_code, 200)
  113.  
  114.     def test_404_url(self):
  115.         """ Test 404 """
  116.         response = self.client.get("/404error/")
  117.         self.assertEqual(response.status_code, 404)
  118.  
  119.     def test_logged_in_post(self):
  120.         """ Test post creating """
  121.         response = self.client.post(
  122.             reverse("new_post"),
  123.             {
  124.                 "text": "New post",
  125.                 "author": self.user
  126.             },
  127.             follow=True
  128.         )
  129.         cache.clear()
  130.         lastpost = Post.objects.latest("pub_date")
  131.         self.assertEqual(response.status_code, 200)
  132.         self.assertEqual(lastpost.text, "New post")
  133.  
  134.     def check_unauthorized(self, response):
  135.         """ Check unauthorized attempt """
  136.         loginurl = reverse("login")
  137.         newposturl = reverse("new_post")
  138.         url = f"{loginurl}?next={newposturl}"
  139.         self.assertRedirects(
  140.             response,
  141.             url,
  142.             status_code=302, target_status_code=200
  143.         )
  144.  
  145.     def test_not_logged_redirect(self):
  146.         """ Test unauthorized posting """
  147.         response = self.client_unauthorized.get(reverse("new_post"))
  148.         self.check_unauthorized(response)
  149.         response = self.client_unauthorized.post(
  150.             reverse("new_post"),
  151.             {
  152.                 "text": "Unreg post",
  153.                 "author": self.user
  154.             }
  155.         )
  156.         self.check_unauthorized(response)
  157.         response = self.client_unauthorized.get(
  158.             reverse("new_post")
  159.         )
  160.         self.check_unauthorized(response)
  161.         # Check in DB
  162.         lastpost = Post.objects.latest("pub_date")
  163.         self.assertNotEqual(lastpost.text, "Unreg post")
  164.  
  165.     def test_new_post(self):
  166.         """ Test fixture post in various areas """
  167.         self.check_if_post_is_displaying(self.post, self.testgroup)
  168.  
  169.     def test_logged_in_edit_show(self):
  170.         """ Logged in user can edit post """
  171.         response = self.client.post(
  172.             reverse("post_edit", args=[self.user.username, self.post.pk]),
  173.             {
  174.                 "text": "Edited post",
  175.                 "author": self.user,
  176.                 "group": self.testgroup2.id
  177.             },
  178.             follow=True
  179.         )
  180.         editedpost = Post.objects.get(pk=self.post.pk)
  181.         self.assertEqual(response.status_code, 200)
  182.         # test all pages
  183.         self.check_if_post_is_displaying(editedpost, self.testgroup2)
  184.         # test if previous group page is empty
  185.         oldgroupurl = reverse("group_url", args=[self.testgroup.slug])
  186.         response = self.client.get(oldgroupurl)
  187.         self.assertEqual(len(response.context["page"]), 0)
  188.  
  189.     def check_if_post_is_displaying(self, post_to_compare, group_object):
  190.         """ Test displaying in various areas """
  191.         # index
  192.         response = self.client.get(reverse("index"))
  193.         self.detail_multipost_comparison(response, post_to_compare)
  194.  
  195.         # profile
  196.         response = self.client.get(
  197.             reverse("profile", args=[self.user.username])
  198.         )
  199.         self.detail_multipost_comparison(response, post_to_compare)
  200.  
  201.         # post
  202.         response = self.client.get(
  203.             reverse("post_single", args=[self.user.username, self.post.pk])
  204.         )
  205.         self.detail_singlepost_comparison(response, post_to_compare)
  206.  
  207.         # group
  208.         response = self.client.get(
  209.             reverse("group_url", args=[group_object.slug])
  210.         )
  211.         self.detail_multipost_comparison(response, post_to_compare)
  212.  
  213.     def detail_multipost_comparison(self, response, post_to_compare):
  214.         """ Extract first post of array """
  215.         page = response.context["page"]
  216.         post = page[0]
  217.         self.post_comparison(response, post, post_to_compare)
  218.  
  219.     def detail_singlepost_comparison(self, response, post_to_compare):
  220.         """ Take the only post in context """
  221.         post = response.context["post"]
  222.         self.post_comparison(response, post, post_to_compare)
  223.  
  224.     def post_comparison(self, response, post, post_to_compare):
  225.         """ Actual compararing process """
  226.         self.assertEqual(response.status_code, 200)
  227.         post_one = (post.text, post.id, post.author, post.group,)
  228.         post_two = (
  229.             post_to_compare.text,
  230.             post_to_compare.id,
  231.             post_to_compare.author,
  232.             post_to_compare.group,
  233.         )
  234.         self.assertEqual(post_one, post_two)
  235.  
  236.     def test_cache(self):
  237.         """ Test 20 sec index cache """
  238.         response = self.client.get(reverse("index"))
  239.         cache_test = response["Cache-Control"]
  240.         self.assertEqual(cache_test, "max-age=20")
  241.         self.assertEqual(len(response.context["page"]), 1)
  242.         # create skynet post
  243.         self.post_skynet = Post.objects.create(
  244.             text="Skynet test",
  245.             author=self.author,
  246.             group=self.testgroup
  247.         )
  248.         response = self.client.get(reverse("index"))
  249.         self.assertIsNone(response.context)
  250.         cache.clear()
  251.         response = self.client.get(reverse("index"))
  252.         self.assertEqual(len(response.context["page"]), 2)
  253.  
  254.     def test_logged_in_subscribe(self):
  255.         """ Logged in can subscribe to authors """
  256.         response = self.client.get(
  257.             reverse("profile_follow", args=["skynet"]),
  258.             follow=True
  259.         )
  260.         self.assertEqual(response.status_code, 200)
  261.         self.assertTrue(Follow.objects.filter(
  262.             user=self.user, author=self.author).exists()
  263.         )
  264.  
  265.     def test_logged_in_unsubscribe(self):
  266.         """ Logged in can unsubscribe from authors """
  267.         Follow.objects.create(user=self.user, author=self.author)
  268.         response = self.client.get(
  269.             reverse("profile_unfollow", args=["skynet"]),
  270.             follow=True
  271.         )
  272.         self.assertEqual(response.status_code, 200)
  273.         num = Follow.objects.filter(user=self.user, author=self.author).count()
  274.         self.assertEqual(num, 0)
  275.  
  276.     def test_logged_out_subscribe(self):
  277.         """ Logged out can not subscribe to authors """
  278.         response = self.client_unauthorized.get(
  279.             reverse("profile_follow", args=["sarah"])
  280.         )
  281.         self.assertEqual(response.status_code, 302)
  282.         num = Follow.objects.filter(author=self.user).count()
  283.         self.assertEqual(num, 0)
  284.  
  285.     def test_new_post_on_follow_page(self):
  286.         """ New post displays on follow page
  287.            of subscribed authors and does not
  288.            display if author not followed """
  289.  
  290.         Follow.objects.create(user=self.user, author=self.author)
  291.         # create skynet post
  292.         post_skynet = Post.objects.create(
  293.             text="Skynet test displaying",
  294.             author=self.author,
  295.             group=self.testgroup
  296.         )
  297.         # check if post shows up
  298.         display_resp = self.client.get(
  299.             reverse("follow_index"),
  300.         )
  301.         page = display_resp.context["page"]
  302.         post = page[0]
  303.         self.assertEqual(
  304.             post_skynet.text,
  305.             post.text
  306.         )
  307.         self.assertEqual(
  308.             post_skynet.group,
  309.             post.group
  310.         )
  311.  
  312.     def test_new_post_not_on_follow_page(self):
  313.         """ Check if post is hidden if not following """
  314.         # create skynet post
  315.         Post.objects.create(
  316.             text="Skynet test not displaying",
  317.             author=self.author,
  318.             group=self.testgroup
  319.         )
  320.         response = self.client.get(reverse("follow_index"))
  321.         page = response.context["page"]
  322.         elements = len(page)
  323.         self.assertEqual(elements, 0)
  324.  
  325.     def test_logged_in_comment(self):
  326.         """ Logged user can comment """
  327.         response = self.client.post(
  328.             reverse("add_comment", args=[self.post.author, self.post.pk]),
  329.             {
  330.                 "text": "Commenting",
  331.                 "author": self.user
  332.             },
  333.             follow=True
  334.         )
  335.         # compare context to database
  336.         comments = response.context["items"]
  337.         comment = comments[0]
  338.         db_comment = Comment.objects.latest("created")
  339.         self.assertEqual(
  340.             comment.text,
  341.             db_comment.text
  342.         )
  343.         self.assertEqual(
  344.             comment.author,
  345.             db_comment.author
  346.         )
  347.  
  348.     def test_logged_out_comment(self):
  349.         """ Logged out can not comment """
  350.         response = self.client_unauthorized.post(
  351.             reverse("add_comment", args=[self.post.author, self.post.pk]),
  352.             {
  353.                 "text": "Commenting"
  354.             },
  355.             follow=True
  356.         )
  357.         response = self.client.get(
  358.             reverse("post_single", args=[self.post.author, self.post.pk])
  359.         )
  360.         # check there is no comment added
  361.         items = response.context["items"]
  362.         elements = len(items)
  363.         self.assertEqual(elements, 0)
  364.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement