def test_annotated_company_bug(self): """ sometimes annotate causes query to return duplicates """ profile = ProfileFactory() profile_2 = ProfileFactory() company = factories.CompanyFactory() _ = factories.CompanyFactory() services.company_clap(company=company, profile=profile) services.company_clap(company=company, profile=profile_2) n_annotated = annotations.annotate_comment_claps( selectors.get_companies(), profile_id=profile.id).count() n_companies = selectors.get_companies().count() assert n_annotated == n_companies
def test_annotated_comments_annotated(self): """ sometimes annotate causes query to return duplicates """ profile = ProfileFactory() profile_2 = ProfileFactory() thread = factories.ThreadFactory(comments=None) comment = factories.CommentFactory(thread=thread) comment_2 = factories.CommentFactory(thread=thread) services.comment_clap(comment=comment, profile=profile) services.comment_clap(comment=comment_2, profile=profile_2) n_annotated = annotations.annotate_comment_claps( selectors.get_thread_comments(thread_id=thread.id), profile_id=profile.id).count() n_comments = selectors.get_thread_comments(thread_id=thread.id).count() assert n_annotated == n_comments
def test_can_create_company(self): user = UserFactory(groups=["editors"]) profile = ProfileFactory(user=user) assert services.can_create_company(profile) user2 = UserFactory(groups=[]) profile2 = ProfileFactory(user=user2) assert services.can_create_company(profile2) for _ in range(services.MAX_UNMODERATED_CHANGES): factories.CompanyFactory( created_by=profile2, status=choices.ModerationStatus.UNMODERATED.name ) assert not services.can_create_company(profile2)
def test_oauth_login( self, m_get_user_data_from_code, m_create_or_update_user, m_update_profile, client, ): """ Test github/login/view """ user = ProfileFactory().user user_data = UserData(name="Fake Name", provider=UserProviderChoices.GITHUB.name) profile_data = ProfileData() m_get_user_data_from_code.return_value = (user.email, user_data, profile_data) m_create_or_update_user.return_value = user resp = client.post( "/users/login/github/?code=fakecode&redirect_uri=fakeuri") assert resp.status_code == 200 m_get_user_data_from_code.assert_called_once_with( "fakecode", "fakeuri") m_create_or_update_user.assert_called_once_with(email=user.email, user_data=user_data) m_update_profile.assert_called_once_with(user=user, profile_data=profile_data)
def test_create_revision(self): profile = ProfileFactory() company = factories.CompanyFactory() revision = services.create_revision( company=company, created_by=profile, name="X" ) assert revision.company == company assert revision.name == "X"
def test_create_image_asset(): data_uri = """data:image/png;base64,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""" img_file = create_image_file_from_data_uri(data_uri) profile = ProfileFactory() img = create_image_asset(img_file=img_file, width=1, height=1, profile=profile) assert img.created_by == profile assert img.width == img.height == 1
def test_company_clap(self): profile = ProfileFactory() company = factories.CompanyFactory() assert company.clappers.count() == 0 rv = services.company_clap(company=company, profile=profile) assert rv == 1 rv2 = services.company_clap(company=company, profile=profile) assert rv2 == 1 assert company.clappers.count() == 1
def test_annotated_company(self): profile_1 = ProfileFactory() profile_2 = ProfileFactory() company_1 = factories.CompanyFactory() company_2 = factories.CompanyFactory() assert company_1.clappers.count() == company_2.clappers.count() == 0 assert services.company_clap(company=company_1, profile=profile_1) == 1 assert services.company_clap(company=company_2, profile=profile_2) == 1 qs_anno_1 = annotations.annotate_company_claps( selectors.get_companies(), profile_id=profile_1.id) assert qs_anno_1.get(id=company_1.id).user_did_clap is True assert qs_anno_1.get(id=company_2.id).user_did_clap is False qs_anno_2 = annotations.annotate_company_claps( selectors.get_companies(), profile_id=profile_2.id) assert qs_anno_2.get(id=company_1.id).user_did_clap is False assert qs_anno_2.get(id=company_2.id).user_did_clap is True
def test_comment_clap(self): thread = factories.ThreadFactory(comments=None) comment = factories.CommentFactory(thread=thread) profile = ProfileFactory() assert comment.clappers.count() == 0 rv = services.comment_clap(comment=comment, profile=profile) assert rv == 1 rv2 = services.comment_clap(comment=comment, profile=profile) assert rv2 == 1 assert comment.clappers.count() == 1
def test_create_comment(self): profile = ProfileFactory() text = "xxx" thread = factories.ThreadFactory(comments=None) assert thread.comments.count() == 0 comment = services.create_comment(profile=profile, text=text, thread=thread) assert thread.comments.count() == 1 assert comment.text == text assert comment.profile == profile services.create_comment(profile=profile, text=text, thread=thread) assert thread.comments.count() == 2
def test_annotated_comments(self): thread = factories.ThreadFactory(comments=None) profile_1 = ProfileFactory() profile_2 = ProfileFactory() comment_1 = factories.CommentFactory(thread=thread) comment_2 = factories.CommentFactory(thread=thread) assert comment_1.clappers.count() == comment_2.clappers.count() == 0 assert services.comment_clap(comment=comment_1, profile=profile_1) == 1 assert services.comment_clap(comment=comment_2, profile=profile_2) == 1 comments_1 = annotations.annotate_comment_claps( selectors.get_thread_comments(thread_id=thread.id), profile_id=profile_1.id, ) assert comments_1.all()[0].user_did_clap is True assert comments_1.all()[1].user_did_clap is False comments_2 = annotations.annotate_comment_claps( selectors.get_thread_comments(thread_id=thread.id), profile_id=profile_2.id) assert comments_2.all()[0].user_did_clap is False assert comments_2.all()[1].user_did_clap is True
def handle(self, *args, **options): profile = ProfileFactory() profile_2 = ProfileFactory() file = create_image_file_from_url( "https://upload.wikimedia.org/wikipedia/commons/4/49/Mosuo_Woman_-_42723465920.jpg" ) profile.avatar = create_image_asset(img_file=file) profile.save() for ( name, description, website, location, logo_url, cover_url, hashtag_names, ) in seed_data: slug = slugify(name) company = models.Company.objects.filter(slug=slug).first() if company: print(f"> Already exists: {slug} - flush or delete to recreate") continue else: print(f"> Created: {slug}") revision_kwargs = dict( name=name, description=description, website=website, location=location, twitter="aec_works", crunchbase_id="apple", logo=None, cover=None, hashtags=hashtag_names, ) company = services.create_company(created_by=profile, **revision_kwargs) # Logo logo_file = create_image_file_from_url(logo_url) logo_img = create_image_asset(img_file=logo_file) company.current_revision.logo = logo_img # Cover cover_file = create_image_file_from_url(cover_url) cover_img = create_image_asset(img_file=cover_file) company.current_revision.cover = cover_img company.current_revision.save() print(f" logo: {logo_url}") print(f" cover: {cover_url}") comments = [ f.CommentFactory(profile=profile, thread=company.thread) for _ in range(3) ] services.comment_clap(comment=comments[0], profile=profile) services.comment_clap(comment=comments[2], profile=profile_2) if name[0] > "g": services.company_clap(company=company, profile=profile) print(" comments") if name == "1Build" and company.articles.count() == 0: company.banner = "Hiring" company.save() services.create_company_article( company=company, url="https://www.archdaily.com/793082/la-serena-house-sebastian-gaviria-gomez?ad_medium=widget&ad_name=selected-buildings-stream", profile=profile, ) services.create_company_article( company=company, url="https://www.archdaily.com/788489/nilo-houses-alberto-burckhard-plus-carolina-echeverri?ad_medium=widget&ad_name=recommendation", profile=profile, )
def test_profile_company_claps(self, auth_client): profile = ProfileFactory() co = f.CompanyFactory(current_revision__name="X") services.company_clap(company=co, profile=profile) resp = auth_client.get(f"/community/companies/claps/{profile.slug}/") assert resp.status_code == 200
class TestUserViews: @pytest.mark.parametrize( "path,param_factory", [["profiles/", None], ["profiles/{0}/", lambda: ProfileFactory().slug] ], ) def test_get_views_annonymous(self, client, path, param_factory): if param_factory: path = path.format(param_factory()) url = f"/users/{path}" resp = client.get(url) assert resp.status_code == 200 @mock.patch("api.users.views.services.update_profile") @mock.patch("api.users.views.services.create_or_update_user") @mock.patch("api.users.views.GithubProvider.get_user_data_from_code") def test_oauth_login( self, m_get_user_data_from_code, m_create_or_update_user, m_update_profile, client, ): """ Test github/login/view """ user = ProfileFactory().user user_data = UserData(name="Fake Name", provider=UserProviderChoices.GITHUB.name) profile_data = ProfileData() m_get_user_data_from_code.return_value = (user.email, user_data, profile_data) m_create_or_update_user.return_value = user resp = client.post( "/users/login/github/?code=fakecode&redirect_uri=fakeuri") assert resp.status_code == 200 m_get_user_data_from_code.assert_called_once_with( "fakecode", "fakeuri") m_create_or_update_user.assert_called_once_with(email=user.email, user_data=user_data) m_update_profile.assert_called_once_with(user=user, profile_data=profile_data) def test_oauth_missing_code(selfixi, client): resp = client.post("/users/login/github/") assert resp.status_code == 400 def test_oauth_bad_provider(self, client): resp = client.post("/users/login/facebook/") assert resp.status_code == 400 def test_profile_annon(self, client): resp = client.get("/users/profiles/me/") assert resp.status_code == 403 def test_profile(self, django_user_model): user = django_user_model.objects.create(email="*****@*****.**", password="******") client = APIClient() client.force_authenticate(user=user) resp = client.get("/users/profiles/me/") assert resp.status_code == 200 def test_login(self, django_user_model): name = "x" email = "*****@*****.**" password = "******" user = django_user_model(name=name, email=email) user.set_password(password) user.save() client = APIClient() resp = client.post("/users/login/", { "email": email, "password": password }) assert resp.status_code == 200 assert resp.json()["name"] == name