test_social_pipeline.py 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674
  1. # -*- coding: utf-8 -*-
  2. import json
  3. from django.contrib.auth import get_user_model
  4. from django.core import mail
  5. from django.test import RequestFactory, override_settings
  6. from social_core.backends.github import GithubOAuth2
  7. from social_django.utils import load_strategy
  8. from misago.core.exceptions import SocialAuthFailed, SocialAuthBanned
  9. from misago.users.models import AnonymousUser, Ban, BanCache
  10. from misago.users.social.pipeline import (
  11. associate_by_email, create_user, create_user_with_form, get_username, require_activation,
  12. validate_ip_not_banned, validate_user_not_banned
  13. )
  14. from misago.users.testutils import UserTestCase
  15. UserModel = get_user_model()
  16. def create_request(user_ip='0.0.0.0', data=None):
  17. factory = RequestFactory()
  18. if data is None:
  19. request = factory.get('/')
  20. else:
  21. request = factory.post('/', data=json.dumps(data), content_type='application/json')
  22. request.include_frontend_context = True
  23. request.frontend_context = {}
  24. request.session = {}
  25. request.user = AnonymousUser()
  26. request.user_ip = user_ip
  27. return request
  28. class MockStrategy(object):
  29. def __init__(self, user_ip='0.0.0.0'):
  30. self.cleaned_partial_token = None
  31. self.request = create_request(user_ip)
  32. def clean_partial_pipeline(self, token):
  33. self.cleaned_partial_token = token
  34. class PipelineTestCase(UserTestCase):
  35. def get_initial_user(self):
  36. self.user = self.get_authenticated_user()
  37. def assertNewUserIsCorrect(
  38. self, new_user, form_data=None, activation=None, email_verified=False):
  39. self.assertFalse(new_user.has_usable_password())
  40. self.assertIn('Welcome', mail.outbox[0].subject)
  41. if form_data:
  42. self.assertEqual(new_user.email, form_data['email'])
  43. self.assertEqual(new_user.username, form_data['username'])
  44. if activation == 'none':
  45. self.assertEqual(new_user.requires_activation, UserModel.ACTIVATION_NONE)
  46. if activation == 'user':
  47. if email_verified:
  48. self.assertEqual(new_user.requires_activation, UserModel.ACTIVATION_NONE)
  49. else:
  50. self.assertEqual(new_user.requires_activation, UserModel.ACTIVATION_USER)
  51. if activation == 'admin':
  52. self.assertEqual(new_user.requires_activation, UserModel.ACTIVATION_ADMIN)
  53. self.assertEqual(new_user.audittrail_set.count(), 1)
  54. def assertJsonResponseEquals(self, response, value):
  55. response_content = response.content.decode("utf-8")
  56. response_json = json.loads(response_content)
  57. self.assertEqual(response_json, value)
  58. class AssociateByEmailTests(PipelineTestCase):
  59. def test_skip_if_user_is_already_set(self):
  60. """pipeline step is skipped if user was found by previous step"""
  61. result = associate_by_email(None, {}, GithubOAuth2, self.user)
  62. self.assertIsNone(result)
  63. def test_skip_if_no_email_passed(self):
  64. """pipeline step is skipped if no email was passed"""
  65. result = associate_by_email(None, {}, GithubOAuth2)
  66. self.assertIsNone(result)
  67. def test_skip_if_user_with_email_not_found(self):
  68. """pipeline step is skipped if no email was passed"""
  69. result = associate_by_email(None, {'email': 'not@found.com'}, GithubOAuth2)
  70. self.assertIsNone(result)
  71. def test_raise_if_user_is_inactive(self):
  72. """pipeline raises if user was inactive"""
  73. self.user.is_active = False
  74. self.user.save()
  75. try:
  76. associate_by_email(None, {'email': self.user.email}, GithubOAuth2)
  77. self.fail("associate_by_email should raise SocialAuthFailed")
  78. except SocialAuthFailed as e:
  79. self.assertEqual(
  80. e.message,
  81. (
  82. "The e-mail address associated with your GitHub account is not available for "
  83. "use on this site."
  84. ),
  85. )
  86. def test_raise_if_user_needs_admin_activation(self):
  87. """pipeline raises if user needs admin activation"""
  88. self.user.requires_activation = UserModel.ACTIVATION_ADMIN
  89. self.user.save()
  90. try:
  91. associate_by_email(None, {'email': self.user.email}, GithubOAuth2)
  92. self.fail("associate_by_email should raise SocialAuthFailed")
  93. except SocialAuthFailed as e:
  94. self.assertEqual(
  95. e.message,
  96. (
  97. "Your account has to be activated by site administrator before you will be "
  98. "able to sign in with GitHub."
  99. ),
  100. )
  101. def test_return_user(self):
  102. """pipeline returns user if email was found"""
  103. result = associate_by_email(None, {'email': self.user.email}, GithubOAuth2)
  104. self.assertEqual(result, {'user': self.user, 'is_new': False})
  105. def test_return_user_email_inactive(self):
  106. """pipeline returns user even if they didn't activate their account manually"""
  107. self.user.requires_activation = UserModel.ACTIVATION_USER
  108. self.user.save()
  109. result = associate_by_email(None, {'email': self.user.email}, GithubOAuth2)
  110. self.assertEqual(result, {'user': self.user, 'is_new': False})
  111. class CreateUser(PipelineTestCase):
  112. def test_skip_if_user_is_set(self):
  113. """pipeline step is skipped if user was passed"""
  114. result = create_user(MockStrategy(), {}, GithubOAuth2(), user=self.user)
  115. self.assertIsNone(result)
  116. def test_skip_if_no_email_passed(self):
  117. """pipeline step is skipped if no email was passed"""
  118. result = create_user(
  119. MockStrategy(),
  120. {},
  121. GithubOAuth2(),
  122. clean_username='TestBob',
  123. )
  124. self.assertIsNone(result)
  125. def test_skip_if_no_clean_username_passed(self):
  126. """pipeline step is skipped if cleaned username wasnt passed"""
  127. result = create_user(
  128. MockStrategy(),
  129. {'email': 'hello@example.com'},
  130. GithubOAuth2(),
  131. )
  132. self.assertIsNone(result)
  133. def test_skip_if_email_is_taken(self):
  134. """pipeline step is skipped if email was taken"""
  135. result = create_user(
  136. MockStrategy(),
  137. {'email': self.user.email},
  138. GithubOAuth2(),
  139. clean_username='NewUser',
  140. )
  141. self.assertIsNone(result)
  142. @override_settings(account_activation='none')
  143. def test_user_created_no_activation(self):
  144. """pipeline step creates active user for valid data and disabled activation"""
  145. result = create_user(
  146. MockStrategy(),
  147. {'email': 'new@example.com'},
  148. GithubOAuth2(),
  149. clean_username='NewUser',
  150. )
  151. new_user = UserModel.objects.get(email='new@example.com')
  152. self.assertEqual(result, {
  153. 'user': new_user,
  154. 'is_new': True,
  155. })
  156. self.assertEqual(new_user.username, 'NewUser')
  157. self.assertNewUserIsCorrect(new_user, email_verified=True, activation='none')
  158. @override_settings(account_activation='user')
  159. def test_user_created_activation_by_user(self):
  160. """pipeline step creates active user for valid data and user activation"""
  161. result = create_user(
  162. MockStrategy(),
  163. {'email': 'new@example.com'},
  164. GithubOAuth2(),
  165. clean_username='NewUser',
  166. )
  167. new_user = UserModel.objects.get(email='new@example.com')
  168. self.assertEqual(result, {
  169. 'user': new_user,
  170. 'is_new': True,
  171. })
  172. self.assertEqual(new_user.username, 'NewUser')
  173. self.assertNewUserIsCorrect(new_user, email_verified=True, activation='user')
  174. @override_settings(account_activation='admin')
  175. def test_user_created_activation_by_admin(self):
  176. """pipeline step creates in user for valid data and admin activation"""
  177. result = create_user(
  178. MockStrategy(),
  179. {'email': 'new@example.com'},
  180. GithubOAuth2(),
  181. clean_username='NewUser',
  182. )
  183. new_user = UserModel.objects.get(email='new@example.com')
  184. self.assertEqual(result, {
  185. 'user': new_user,
  186. 'is_new': True,
  187. })
  188. self.assertEqual(new_user.username, 'NewUser')
  189. self.assertNewUserIsCorrect(new_user, email_verified=True, activation='admin')
  190. class CreateUserWithFormTests(PipelineTestCase):
  191. def test_skip_if_user_is_set(self):
  192. """pipeline step is skipped if user was passed"""
  193. request = create_request()
  194. strategy = load_strategy(request=request)
  195. backend = GithubOAuth2(strategy, '/')
  196. result = create_user_with_form(
  197. strategy=strategy,
  198. details={},
  199. backend=backend,
  200. user=self.user,
  201. pipeline_index=1,
  202. )
  203. self.assertEqual(result, {})
  204. def test_renders_form_if_not_post(self):
  205. """pipeline step renders form if not POST"""
  206. request = create_request()
  207. strategy = load_strategy(request=request)
  208. backend = GithubOAuth2(strategy, '/')
  209. response = create_user_with_form(
  210. strategy=strategy,
  211. details={},
  212. backend=backend,
  213. user=None,
  214. pipeline_index=1,
  215. )
  216. self.assertContains(response, "GitHub")
  217. def test_empty_data_rejected(self):
  218. """form rejects empty data"""
  219. request = create_request(data={})
  220. strategy = load_strategy(request=request)
  221. backend = GithubOAuth2(strategy, '/')
  222. response = create_user_with_form(
  223. strategy=strategy,
  224. details={},
  225. backend=backend,
  226. user=None,
  227. pipeline_index=1,
  228. )
  229. self.assertEqual(response.status_code, 400)
  230. self.assertJsonResponseEquals(response, {
  231. 'email': ["This field is required."],
  232. 'username': ["This field is required."],
  233. })
  234. def test_taken_data_rejected(self):
  235. """form rejects taken data"""
  236. request = create_request(data={
  237. 'email': self.user.email,
  238. 'username': self.user.username,
  239. })
  240. strategy = load_strategy(request=request)
  241. backend = GithubOAuth2(strategy, '/')
  242. response = create_user_with_form(
  243. strategy=strategy,
  244. details={},
  245. backend=backend,
  246. user=None,
  247. pipeline_index=1,
  248. )
  249. self.assertEqual(response.status_code, 400)
  250. self.assertJsonResponseEquals(response, {
  251. 'email': ["This e-mail address is not available."],
  252. 'username': ["This username is not available."],
  253. })
  254. @override_settings(account_activation='none')
  255. def test_user_created_no_activation_verified_email(self):
  256. """active user is created for verified email and activation disabled"""
  257. form_data = {
  258. 'email': 'social@auth.com',
  259. 'username': 'SocialUser',
  260. }
  261. request = create_request(data=form_data)
  262. strategy = load_strategy(request=request)
  263. backend = GithubOAuth2(strategy, '/')
  264. result = create_user_with_form(
  265. strategy=strategy,
  266. details={'email': form_data['email']},
  267. backend=backend,
  268. user=None,
  269. pipeline_index=1,
  270. )
  271. new_user = UserModel.objects.get(email='social@auth.com')
  272. self.assertEqual(result, {'user': new_user, 'is_new': True})
  273. self.assertNewUserIsCorrect(new_user, form_data, activation='none', email_verified=True)
  274. @override_settings(account_activation='none')
  275. def test_user_created_no_activation_nonverified_email(self):
  276. """active user is created for non-verified email and activation disabled"""
  277. form_data = {
  278. 'email': 'social@auth.com',
  279. 'username': 'SocialUser',
  280. }
  281. request = create_request(data=form_data)
  282. strategy = load_strategy(request=request)
  283. backend = GithubOAuth2(strategy, '/')
  284. result = create_user_with_form(
  285. strategy=strategy,
  286. details={'email': ''},
  287. backend=backend,
  288. user=None,
  289. pipeline_index=1,
  290. )
  291. new_user = UserModel.objects.get(email='social@auth.com')
  292. self.assertEqual(result, {'user': new_user, 'is_new': True})
  293. self.assertNewUserIsCorrect(new_user, form_data, activation='none', email_verified=False)
  294. @override_settings(account_activation='user')
  295. def test_user_created_activation_by_user_verified_email(self):
  296. """active user is created for verified email and activation by user"""
  297. form_data = {
  298. 'email': 'social@auth.com',
  299. 'username': 'SocialUser',
  300. }
  301. request = create_request(data=form_data)
  302. strategy = load_strategy(request=request)
  303. backend = GithubOAuth2(strategy, '/')
  304. result = create_user_with_form(
  305. strategy=strategy,
  306. details={'email': form_data['email']},
  307. backend=backend,
  308. user=None,
  309. pipeline_index=1,
  310. )
  311. new_user = UserModel.objects.get(email='social@auth.com')
  312. self.assertEqual(result, {'user': new_user, 'is_new': True})
  313. self.assertNewUserIsCorrect(new_user, form_data, activation='user', email_verified=True)
  314. @override_settings(account_activation='user')
  315. def test_user_created_activation_by_user_nonverified_email(self):
  316. """inactive user is created for non-verified email and activation by user"""
  317. form_data = {
  318. 'email': 'social@auth.com',
  319. 'username': 'SocialUser',
  320. }
  321. request = create_request(data=form_data)
  322. strategy = load_strategy(request=request)
  323. backend = GithubOAuth2(strategy, '/')
  324. result = create_user_with_form(
  325. strategy=strategy,
  326. details={'email': ''},
  327. backend=backend,
  328. user=None,
  329. pipeline_index=1,
  330. )
  331. new_user = UserModel.objects.get(email='social@auth.com')
  332. self.assertEqual(result, {'user': new_user, 'is_new': True})
  333. self.assertNewUserIsCorrect(new_user, form_data, activation='user', email_verified=False)
  334. @override_settings(account_activation='admin')
  335. def test_user_created_activation_by_admin_verified_email(self):
  336. """inactive user is created for verified email and activation by admin"""
  337. form_data = {
  338. 'email': 'social@auth.com',
  339. 'username': 'SocialUser',
  340. }
  341. request = create_request(data=form_data)
  342. strategy = load_strategy(request=request)
  343. backend = GithubOAuth2(strategy, '/')
  344. result = create_user_with_form(
  345. strategy=strategy,
  346. details={'email': form_data['email']},
  347. backend=backend,
  348. user=None,
  349. pipeline_index=1,
  350. )
  351. new_user = UserModel.objects.get(email='social@auth.com')
  352. self.assertEqual(result, {'user': new_user, 'is_new': True})
  353. self.assertNewUserIsCorrect(new_user, form_data, activation='admin', email_verified=True)
  354. @override_settings(account_activation='admin')
  355. def test_user_created_activation_by_admin_nonverified_email(self):
  356. """inactive user is created for non-verified email and activation by admin"""
  357. form_data = {
  358. 'email': 'social@auth.com',
  359. 'username': 'SocialUser',
  360. }
  361. request = create_request(data=form_data)
  362. strategy = load_strategy(request=request)
  363. backend = GithubOAuth2(strategy, '/')
  364. result = create_user_with_form(
  365. strategy=strategy,
  366. details={'email': ''},
  367. backend=backend,
  368. user=None,
  369. pipeline_index=1,
  370. )
  371. new_user = UserModel.objects.get(email='social@auth.com')
  372. self.assertEqual(result, {'user': new_user, 'is_new': True})
  373. self.assertNewUserIsCorrect(new_user, form_data, activation='admin', email_verified=False)
  374. class GetUsernameTests(PipelineTestCase):
  375. def test_skip_if_user_is_set(self):
  376. """pipeline step is skipped if user was passed"""
  377. result = get_username(None, {}, None, user=self.user)
  378. self.assertIsNone(result)
  379. def test_skip_if_no_names(self):
  380. """pipeline step is skipped if API returned no names"""
  381. result = get_username(None, {}, None)
  382. self.assertIsNone(result)
  383. def test_resolve_to_username(self):
  384. """pipeline step resolves username"""
  385. result = get_username(None, {'username': 'BobBoberson'}, None)
  386. self.assertEqual(result, {'clean_username': 'BobBoberson'})
  387. def test_normalize_username(self):
  388. """pipeline step normalizes username"""
  389. result = get_username(None, {'username': u'Błop Błoperson'}, None)
  390. self.assertEqual(result, {'clean_username': 'BlopBloperson'})
  391. def test_resolve_to_first_name(self):
  392. """pipeline attempts to use first name because username is taken"""
  393. details = {
  394. 'username': self.user.username,
  395. 'first_name': u'Błob',
  396. }
  397. result = get_username(None, details, None)
  398. self.assertEqual(result, {'clean_username': 'Blob'})
  399. def test_dont_resolve_to_last_name(self):
  400. """pipeline will not fallback to last name because username is taken"""
  401. details = {
  402. 'username': self.user.username,
  403. 'last_name': u'Błob',
  404. }
  405. result = get_username(None, details, None)
  406. self.assertIsNone(result)
  407. def test_resolve_to_first_last_name_first_char(self):
  408. """pipeline will construct username from first name and first char of surname"""
  409. details = {
  410. 'first_name': self.user.username,
  411. 'last_name': u'Błob',
  412. }
  413. result = get_username(None, details, None)
  414. self.assertEqual(result, {'clean_username': self.user.username + 'B'})
  415. def test_dont_resolve_to_banned_name(self):
  416. """pipeline will not resolve to banned name"""
  417. Ban.objects.create(banned_value='*Admin*', check_type=Ban.USERNAME)
  418. details = {
  419. 'username': 'Misago Admin',
  420. 'first_name': u'Błob',
  421. }
  422. result = get_username(None, details, None)
  423. self.assertEqual(result, {'clean_username': 'Blob'})
  424. def test_resolve_full_name(self):
  425. """pipeline will resolve to full name"""
  426. Ban.objects.create(banned_value='*Admin*', check_type=Ban.USERNAME)
  427. details = {
  428. 'username': 'Misago Admin',
  429. 'full_name': u'Błob Błopo',
  430. }
  431. result = get_username(None, details, None)
  432. self.assertEqual(result, {'clean_username': 'BlobBlopo'})
  433. def test_resolve_to_cut_name(self):
  434. """pipeline will resolve cut too long name on second pass"""
  435. details = {
  436. 'username': u'Abrakadabrapokuskonstantynopolitańczykowianeczkatrzy',
  437. }
  438. result = get_username(None, details, None)
  439. self.assertEqual(result, {'clean_username': 'Abrakadabrapok'})
  440. class RequireActivationTests(PipelineTestCase):
  441. def setUp(self):
  442. super(RequireActivationTests, self).setUp()
  443. self.user.requires_activation = UserModel.ACTIVATION_ADMIN
  444. self.user.save()
  445. def test_skip_if_user_not_set(self):
  446. """pipeline step is skipped if user is not set"""
  447. request = create_request()
  448. strategy = load_strategy(request=request)
  449. backend = GithubOAuth2(strategy, '/')
  450. result = require_activation(
  451. strategy=strategy,
  452. details={},
  453. backend=backend,
  454. user=None,
  455. pipeline_index=1,
  456. )
  457. self.assertEqual(result, {})
  458. def test_partial_token_if_user_not_set_no_showstopper(self):
  459. """pipeline step handles set session token if user is not set"""
  460. request = create_request()
  461. strategy = load_strategy(request=request)
  462. strategy.request.session['partial_pipeline_token'] = 'test-token'
  463. backend = GithubOAuth2(strategy, '/')
  464. require_activation(
  465. strategy=strategy,
  466. details={},
  467. backend=backend,
  468. user=None,
  469. pipeline_index=1,
  470. )
  471. def test_skip_if_user_is_active(self):
  472. """pipeline step is skipped if user is active"""
  473. self.user.requires_activation = UserModel.ACTIVATION_NONE
  474. self.user.save()
  475. self.assertFalse(self.user.requires_activation)
  476. request = create_request()
  477. strategy = load_strategy(request=request)
  478. backend = GithubOAuth2(strategy, '/')
  479. result = require_activation(
  480. strategy=strategy,
  481. details={},
  482. backend=backend,
  483. user=self.user,
  484. pipeline_index=1,
  485. )
  486. self.assertEqual(result, {})
  487. def test_pipeline_returns_html_responseon_get(self):
  488. """pipeline step renders http response for GET request and inactive user"""
  489. request = create_request()
  490. strategy = load_strategy(request=request)
  491. backend = GithubOAuth2(strategy, '/')
  492. response = require_activation(
  493. strategy=strategy,
  494. details={},
  495. backend=backend,
  496. user=self.user,
  497. pipeline_index=1,
  498. )
  499. self.assertEqual(response.status_code, 200)
  500. self.assertEqual(response['content-type'], 'text/html; charset=utf-8')
  501. def test_pipeline_returns_json_response_on_post(self):
  502. """pipeline step renders json response for POST request and inactive user"""
  503. request = create_request(data={'username': 'anything'})
  504. strategy = load_strategy(request=request)
  505. backend = GithubOAuth2(strategy, '/')
  506. response = require_activation(
  507. strategy=strategy,
  508. details={},
  509. backend=backend,
  510. user=self.user,
  511. pipeline_index=1,
  512. )
  513. self.assertEqual(response.status_code, 200)
  514. self.assertEqual(response['content-type'], 'application/json')
  515. self.assertJsonResponseEquals(response, {
  516. 'step': 'done',
  517. 'backend_name': 'GitHub',
  518. 'activation': 'admin',
  519. 'email': 'test@user.com',
  520. 'username': 'TestUser',
  521. })
  522. class ValidateIpNotBannedTests(PipelineTestCase):
  523. def test_skip_if_user_not_set(self):
  524. """pipeline step is skipped if no user was passed"""
  525. result = validate_ip_not_banned(None, {}, GithubOAuth2)
  526. self.assertIsNone(result)
  527. def test_raise_if_banned(self):
  528. """pipeline raises if user's IP is banned"""
  529. Ban.objects.create(banned_value='188.*', check_type=Ban.IP)
  530. try:
  531. validate_ip_not_banned(MockStrategy(user_ip='188.1.2.3'), {}, GithubOAuth2, self.user)
  532. self.fail("validate_ip_not_banned should raise SocialAuthBanned")
  533. except SocialAuthBanned as e:
  534. self.assertTrue(isinstance(e.ban, Ban))
  535. def test_exclude_staff(self):
  536. """pipeline excludes staff from bans"""
  537. self.user.is_staff = True
  538. self.user.save()
  539. Ban.objects.create(banned_value='188.*', check_type=Ban.IP)
  540. result = validate_ip_not_banned(
  541. MockStrategy(user_ip='188.1.2.3'), {}, GithubOAuth2, self.user)
  542. self.assertIsNone(result)
  543. class ValidateUserNotBannedTests(PipelineTestCase):
  544. def test_skip_if_user_not_set(self):
  545. """pipeline step is skipped if no user was passed"""
  546. result = validate_user_not_banned(None, {}, GithubOAuth2)
  547. self.assertIsNone(result)
  548. def test_raise_if_banned(self):
  549. """pipeline raises if user's IP is banned"""
  550. Ban.objects.create(banned_value=self.user.username, check_type=Ban.USERNAME)
  551. try:
  552. validate_user_not_banned(MockStrategy(), {}, GithubOAuth2, self.user)
  553. self.fail("validate_ip_not_banned should raise SocialAuthBanned")
  554. except SocialAuthBanned as e:
  555. self.assertEqual(e.ban.user, self.user)
  556. self.assertTrue(isinstance(e.ban, BanCache))
  557. def test_exclude_staff(self):
  558. """pipeline excludes staff from bans"""
  559. self.user.is_staff = True
  560. self.user.save()
  561. Ban.objects.create(banned_value=self.user.username, check_type=Ban.USERNAME)
  562. result = validate_user_not_banned(MockStrategy(), {}, GithubOAuth2, self.user)
  563. self.assertIsNone(result)