From 81cf85c118fc182eb235d74ac8875fadb0d7ed96 Mon Sep 17 00:00:00 2001 From: Alisha Mohanty Date: Aug 03 2019 12:34:03 +0000 Subject: [PATCH 1/2] Write clean and maintanable code for fasidCheck --- diff --git a/assets/js/fas_details.js b/assets/js/fas_details.js index a3231b7..a404883 100644 --- a/assets/js/fas_details.js +++ b/assets/js/fas_details.js @@ -1,72 +1,87 @@ -$(document).ready(function () { +$(function() { /* Place the button inside input field */ - $("#id_fasid").after($("#search_fasid")) + $("#id_fasid").after($("#search_fasid")); /* Making the input fields clear when the page reloads */ - $("#id_fasid").val('') - $("#id_recipient_name").val('') - $("#id_recipient_email").val('') + $("#id_fasid").val(""); + $("#id_recipient_name").val(""); + $("#id_recipient_email").val(""); - $("#search_fasid").click(function () { + $("#search_fasid").click(function() { + let fasid = $("#id_fasid").val(); + $("#server-error").remove(); - let fasid = $('#id_fasid').val() - $("#server-error").remove() - - if (fasid != '') { - - $("#id_recipient_name").attr("placeholder", "") - $("#id_recipient_name").val('') - $("#id_recipient_email").val('') - $("#id_fasid").prop('disabled', true); - $("#no-fas-id-error").remove() - $("#server-error").remove() - $("#div_id_fasid").after('

Searching for FAS Username.........

') - - email = $.get('/send/search', { fasid: fasid }, function (data) { - - if (data['server_error'] == 'True') { - $("#id_fasid").val('') - $('#server-error').remove() - $('.searching-text').remove() - $("#id_fasid").prop('disabled', false); - $("#div_id_fasid").after('

Internal Server Error Occured! Enter Name and Email manually!

') - $('#server-error').fadeIn('slow', function () { - $('#server-error').delay(3000).fadeOut() - }) + if (!fasid) { + console.log("!fasid"); + return; + } + $("#id_recipient_name").attr("placeholder", ""); + $("#id_recipient_name").val(""); + $("#id_recipient_email").val(""); + $("#id_fasid").prop("disabled", true); + $("#no-fas-id-error").remove(); + $("#server-error").remove(); + if (!$('#fas_username_check_message').length) { + $("#div_id_fasid").after( + '

Searching for FAS Username...

' + ); + } + + email = $.ajax({ + type: "GET", + url: "/send/search?fasid=" + encodeURIComponent(fasid), + success: function(data) { + console.log(data); + $(".error").remove(); + $(".searching-text").remove(); + $("#id_fasid").prop("disabled", false); + if (data["privacy"]) { + $("#id_recipient_name").attr( + "placeholder", + "Privacy is Set! Type Name Manually" + ); + } else { + $("#id_recipient_name").val(data["name"]); } - else { - $('.error').remove() - $('.searching-text').remove() - $("#id_fasid").prop('disabled', false); - - if (data['account_exists'] == 'Yes') { - - if (data['name'] == 'No name') { - $("#id_recipient_name").attr("placeholder", "Privacy is Set! Type Name Manually") - } - else { - $("#id_recipient_name").val(data['name']) - } - - $("#id_recipient_email").val(data['email']) - } - else { - $("#no-fas-id-error").remove() - $("#div_id_fasid").after('

Sorry! No such FAS Username exist

') - console.log('No such FAS username exsists') - $('#no-fas-id-error').fadeIn('slow', function () { - $('#no-fas-id-error').delay(2700).fadeOut() - }) - $("#id_fasid").val('') - } - return data; + $("#id_recipient_email").val(data["email"]); + }, + statusCode: { + 404: function(data) { + console.log(data); + $("#no-fas-id-error").remove(); + $("#id_fasid").prop("disabled", false); + $(".searching-text").remove(); + $("#div_id_fasid").after( + '

Sorry! No such FAS Username exist

' + ); + $("#no-fas-id-error").fadeIn("slow", function() { + $("#no-fas-id-error") + .delay(2700) + .fadeOut(); + }); + $("#id_fasid").val(""); + }, + 500: function(data) { + console.log(data); + $("#id_fasid").val(""); + $("#server-error").remove(); + $(".searching-text").remove(); + $("#id_fasid").prop("disabled", false); + $("#div_id_fasid").after( + '

Internal Server Error Occured! Enter Name and Email manually!

' + ); + $("#server-error").fadeIn("slow", function() { + $("#server-error") + .delay(3000) + .fadeOut(); + }); } - }) - } - }) + } + }); + }); }); diff --git a/happinesspackets/messaging/views.py b/happinesspackets/messaging/views.py index 95050cf..70d5aa6 100644 --- a/happinesspackets/messaging/views.py +++ b/happinesspackets/messaging/views.py @@ -252,32 +252,28 @@ class SentMessagesView(UserMessageView): return queryset.filter(sender_email=self.request.user.email) class FasidSearchView(): - @staticmethod def fasidCheck(request): try: fas = AccountSystem(username=settings.ADMIN_USERNAME, password=settings.ADMIN_PASSWORD) fasid = request.GET['fasid'] - is_server_error = 'False' - type_of_error = ' No Error ' person = fas.person_by_username(fasid) - u_name = 'No name' - u_email = 'No email' if not person: logger.error("The FAS username does not exist!") - account_exists = 'No' - else: - account_exists = 'Yes' - privacy = person['privacy'] - if not(privacy): - logger.warn("The privacy is set to not view the Name!") - u_name = person['human_name'] - u_email = person['email'] - request.session['fasid'] = fasid - request.session['recipient_email'] = u_email - context = {'account_exists':account_exists,'email': u_email, 'name': u_name, 'server_error': is_server_error, 'type_of_error': type_of_error} + response = JsonResponse({'error':'The FAS username does not exist!'}) + response.status_code = 404 + return response + if person['privacy']: + logger.warning("The privacy is set to net view the name!") + user = { + 'privacy': person['privacy'], + 'email': person['email'], + 'name': person['human_name'] + } + request.session['fasid'] = fasid + request.session['recipient_email'] = person['email'] + return JsonResponse(user) + except Exception as ex: - type_of_error = ex.__class__.__name__ - logger.error("%s Occured", type_of_error) - is_server_error = 'True' - context = {'account_exists':'Can\'t Say','email': 'Can\'t Say', 'name': 'Can\'t Say', 'server_error': is_server_error, 'type_of_error': type_of_error} - return JsonResponse(context) + response = JsonResponse({'error': 'Internal Server Error'}) + response.status_code = 500 + return response \ No newline at end of file From d95a06c4322732a0c2a02a9798e1b9cb0202cd66 Mon Sep 17 00:00:00 2001 From: Alisha Mohanty Date: Aug 03 2019 12:34:04 +0000 Subject: [PATCH 2/2] Test FASid search functionality using Mocking 1. Add pytest-mock dependency 2. Write tests for fasidCheck for all possible cases --- diff --git a/happinesspackets/messaging/tests/test_mock_fasid.py b/happinesspackets/messaging/tests/test_mock_fasid.py new file mode 100644 index 0000000..a3bc7cc --- /dev/null +++ b/happinesspackets/messaging/tests/test_mock_fasid.py @@ -0,0 +1,69 @@ +import json +from django.test.client import RequestFactory +from ..views import FasidSearchView, AccountSystem +import pytest + + +@pytest.fixture(scope="function") +def call_fasid_check_and_get_response(mocker, mock_response): + factory = RequestFactory() + request = factory.get('/send/search/', {'fasid': 'mockuser'}) + request.session = {} # hack for session middleware + mocker.patch.object(AccountSystem, 'person_by_username', return_value=mock_response) + return FasidSearchView.fasidCheck(request) + + +@pytest.fixture(scope="function") +def call_fasid_check_and_get_server_error(mocker): + factory = RequestFactory() + request = factory.get('/send/search/', {'fasid': 'mockuser'}) + request.session = {} + mocker.patch.object(AccountSystem, 'person_by_username', side_effect=KeyError('human_name')) + return FasidSearchView.fasidCheck(request) + + +@pytest.mark.parametrize("mock_response", [{'privacy': False, 'email': 'mockuser@example.com', 'human_name': 'Mock User'}]) +def test_fasid_check_returns_email_name_and_privacy(call_fasid_check_and_get_response): + + response = call_fasid_check_and_get_response + expected_response = { + 'privacy': False, + 'email': 'mockuser@example.com', + 'name': 'Mock User' + } + + assert response.status_code == 200 + assert json.loads(response.content) == expected_response + + +@pytest.mark.parametrize("mock_response", [{'privacy': True, 'email': 'mockuser@example.com', 'human_name': 'None'}]) +def test_fasid_check_returns_null_in_name_when_user_has_set_privacy_to_true(call_fasid_check_and_get_response): + + response = call_fasid_check_and_get_response + expected_response = { + 'privacy': True, + 'email': 'mockuser@example.com', + 'name': 'None' + } + + assert response.status_code == 200 + assert json.loads(response.content) == expected_response + + +@pytest.mark.parametrize("mock_response", [None]) +def test_fasid_check_returns_404_when_fas_id_does_not_exist(call_fasid_check_and_get_response): + + response = call_fasid_check_and_get_response + expected_response = {'error': 'The FAS username does not exist!'} + + assert response.status_code == 404 + assert json.loads(response.content) == expected_response + + +def test_fasid_check_returns_500_for_an_unhandled_exception(call_fasid_check_and_get_server_error): + + response = call_fasid_check_and_get_server_error + expected_response = {'error': 'Internal Server Error'} + + assert response.status_code == 500 + assert json.loads(response.content) == expected_response diff --git a/happinesspackets/messaging/views.py b/happinesspackets/messaging/views.py index 70d5aa6..e0f71ac 100644 --- a/happinesspackets/messaging/views.py +++ b/happinesspackets/messaging/views.py @@ -263,7 +263,7 @@ class FasidSearchView(): response.status_code = 404 return response if person['privacy']: - logger.warning("The privacy is set to net view the name!") + logger.warning("The privacy is set to not view the name!") user = { 'privacy': person['privacy'], 'email': person['email'], diff --git a/requirements/base.txt b/requirements/base.txt index fc62630..9225aa3 100644 --- a/requirements/base.txt +++ b/requirements/base.txt @@ -59,3 +59,4 @@ django-ckeditor==5.7.0 pytest-django==3.5.0 pytest==4.6.3 pytest-cov==2.7.1 +pytest-mock==1.10.4 \ No newline at end of file