twython/tests/test_endpoints_ads.py

151 lines
6.2 KiB
Python

import base64
import datetime
import cStringIO
import urllib
from twython import Twython, TwythonError, TwythonAuthError
from .config import (
app_key, app_secret, oauth_token, oauth_token_secret,
protected_twitter_1, protected_twitter_2, screen_name,
test_tweet_id, test_list_slug, test_list_owner_screen_name,
access_token, test_tweet_object, test_tweet_html, test_account_id, test_funding_instrument_id, unittest
)
import time
from twython.api_ads import TwythonAds
class TwythonEndpointsTestCase(unittest.TestCase):
TEST_CAMPAIGN = {
'name': 'Test Twitter campaign - Twython',
'funding_instrument_id': test_funding_instrument_id,
'start_time': datetime.datetime.utcnow().strftime('%Y-%m-%dT%H:%M:%SZ'),
'daily_budget_amount_local_micro': 10 * 1000000,
'paused': True
}
TEST_WEBSITE_CLICKS_LINE_ITEM = {
'bid_type': 'MAX',
'bid_amount_local_micro': 2000000,
'product_type': 'PROMOTED_TWEETS',
'placements': 'ALL_ON_TWITTER',
'objective': 'WEBSITE_CLICKS',
'paused': True
}
def setUp(self):
client_args = {
'headers': {
'User-Agent': '__twython__ Test'
},
'allow_redirects': False
}
# This is so we can hit coverage that Twython sets
# User-Agent for us if none is supplied
oauth2_client_args = {
'headers': {}
}
self.api = TwythonAds(app_key, app_secret,
oauth_token, oauth_token_secret,
client_args=client_args)
self.oauth2_api = Twython(app_key, access_token=access_token,
client_args=oauth2_client_args)
def test_get_accounts(self):
accounts = self.api.get_accounts()
self.assertTrue(len(accounts) > 0)
def test_get_account(self):
account = self.api.get_account(test_account_id)
self.assertEqual(account['id'], test_account_id)
with self.assertRaises(TwythonError):
self.api.get_account('1234')
def test_get_account_features(self):
account_features = self.api.get_account_features(test_account_id)
self.assertTrue(len(account_features) > 0)
def test_get_funding_instruments(self):
funding_instruments = self.api.get_funding_instruments(test_account_id)
self.assertTrue(len(funding_instruments) > 0)
def test_get_funding_instrument(self):
funding_instrument = self.api.get_funding_instrument(test_account_id, test_funding_instrument_id)
self.assertEqual(funding_instrument['id'], test_funding_instrument_id)
self.assertEqual(funding_instrument['account_id'], test_account_id)
with self.assertRaises(TwythonError):
self.api.get_funding_instrument('1234', '1234')
def test_get_iab_categories(self):
iab_categories = self.api.get_iab_categories()
self.assertTrue(len(iab_categories) > 0)
def test_get_available_platforms(self):
available_platforms = self.api.get_available_platforms()
self.assertTrue(len(available_platforms) > 0)
def test_get_campaigns(self):
campaigns = self.api.get_campaigns(test_account_id)
self.assertTrue(len(campaigns) > 0)
def test_create_and_delete_campaign(self):
campaign_id = self._create_test_campaign()
campaign_check = self.api.get_campaign(test_account_id, campaign_id)
self.assertEqual(campaign_check['id'], campaign_id)
self._delete_test_campaign(campaign_id)
def _create_test_campaign(self):
campaign = self.api.create_campaign(test_account_id, **self.TEST_CAMPAIGN)
campaign_id = campaign['id']
self.assertEqual(campaign['account_id'], test_account_id)
self.assertIsNotNone(campaign_id)
return campaign_id
def _delete_test_campaign(self, campaign_id):
is_deleted = self.api.delete_campaign(test_account_id, campaign_id)
self.assertTrue(is_deleted)
def test_create_line_item(self):
campaign_id = self._create_test_campaign()
response = self.api.create_line_item(test_account_id, campaign_id, **self.TEST_WEBSITE_CLICKS_LINE_ITEM)
self.assertEqual(response['account_id'], test_account_id)
self.assertEqual(response['campaign_id'], campaign_id)
self._delete_test_campaign(campaign_id)
def test_upload_image(self):
response = self._upload_test_image()
self.assertIsNotNone(response['media_id'])
def _upload_test_image(self):
image_file = urllib.urlopen('https://upload.wikimedia.org/wikipedia/commons/d/db/Patern_test.jpg').read()
image_file_encoded = base64.b64encode(image_file)
upload_data = {
'media_data': image_file_encoded
# the line below will have to be provided once we start uploading photos on behalf of advertisers
# 'additional_owners': ''
}
response = self.api.upload_image(**upload_data)
return response
def test_create_cards_website(self):
# campaign = self.api.create_campaign(test_account_id, **self.TEST_CAMPAIGN)
# campaign_id = campaign['id']
# self.assertEqual(campaign['account_id'], test_account_id)
# line_item = self.api.create_line_item(test_account_id, campaign_id, **self.TEST_WEBSITE_CLICKS_LINE_ITEM)
# self.assertEqual(line_item['account_id'], test_account_id)
# self.assertEqual(line_item['campaign_id'], campaign_id)
uploaded_image = self._upload_test_image()
test_website_card = {
'name': 'Zemanta Partnered with AdsNative for Programmatic Native Supply',
'website_title': 'Zemanta Partnered with AdsNative for Programmatic Native Supply',
'website_url': 'http://r1.zemanta.com/r/u1tllsoizjls/facebook/1009/92325/',
'website_cta': 'READ_MORE',
'image_media_id': uploaded_image['media_id_string']
}
response = self.api.create_website_card(test_account_id, **test_website_card)
self.assertEqual(response['account_id'], test_account_id)
# is_deleted = self.api.delete_campaign(test_account_id, campaign_id)
# self.assertTrue(is_deleted)