test_social_pipeline.py 24 KB

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