Esempio n. 1
0
    async def test_create_app_user(self):

        resp = await self.fetch("/timestamp")
        self.assertEqual(resp.code, 200)

        resp = await self.fetch_signed("/user", signing_key=TEST_PRIVATE_KEY, method="POST",
                                       body={'payment_address': TEST_PAYMENT_ADDRESS, 'is_app': True})

        self.assertResponseCodeEqual(resp, 200)

        body = json_decode(resp.body)

        self.assertEqual(body['toshi_id'], TEST_ADDRESS)

        async with self.pool.acquire() as con:
            row = await con.fetchrow("SELECT * FROM users WHERE toshi_id = $1", TEST_ADDRESS)

        self.assertIsNotNone(row)
        self.assertTrue(row['is_bot'])
        self.assertTrue(row['is_public'])

        self.assertIsNotNone(row['username'])

        # ensure we got a tracking event
        self.assertEqual((await self.next_tracking_event())[0], encode_id(TEST_ADDRESS))

        resp = await self.fetch_signed("/user", signing_key=TEST_PRIVATE_KEY, method="PUT",
                                       body={'is_app': False})

        async with self.pool.acquire() as con:
            row = await con.fetchrow("SELECT * FROM users WHERE toshi_id = $1", TEST_ADDRESS)

        self.assertIsNotNone(row)
        self.assertFalse(row['is_bot'])
        self.assertFalse(row['is_public'])

        resp = await self.fetch_signed("/user", signing_key=TEST_PRIVATE_KEY, method="PUT",
                                       body={'is_app': True})

        async with self.pool.acquire() as con:
            row = await con.fetchrow("SELECT * FROM users WHERE toshi_id = $1", TEST_ADDRESS)

        self.assertIsNotNone(row)
        self.assertTrue(row['is_bot'])
        self.assertTrue(row['is_public'])
Esempio n. 2
0
    async def test_unchanged_username(self):

        username = '******'

        async with self.pool.acquire() as con:
            await con.execute("INSERT INTO users (username, toshi_id) VALUES ($1, $2)", username, TEST_ADDRESS)

        # make sure settings a username with the same eth address succeeds
        body = {
            "username": username,
            "payment_address": TEST_PAYMENT_ADDRESS,
            "name": "Bob Smith"
        }

        resp = await self.fetch_signed("/user", signing_key=TEST_PRIVATE_KEY, method="PUT", body=body)

        self.assertResponseCodeEqual(resp, 200)

        # ensure we got a tracking event
        self.assertEqual((await self.next_tracking_event())[0], encode_id(TEST_ADDRESS))
    async def test_transactions_with_known_sender_toshi_id(self):

        body = {"from": FAUCET_ADDRESS, "to": TEST_ADDRESS, "value": 10**10}

        resp = await self.fetch("/tx/skel", method="POST", body=body)

        self.assertEqual(resp.code, 200)

        tx = sign_transaction(json_decode(resp.body)['tx'], FAUCET_PRIVATE_KEY)

        body = {"tx": tx}

        resp = await self.fetch_signed("/tx",
                                       signing_key=TEST_PRIVATE_KEY_2,
                                       method="POST",
                                       body=body)

        self.assertEqual(resp.code, 200, resp.body)

        # ensure we get a tracking events with a live id
        self.assertEqual((await self.next_tracking_event())[0],
                         encode_id(TEST_ADDRESS_2))

        tx_hash = json_decode(resp.body)['tx_hash']

        async with self.pool.acquire() as con:

            row = await con.fetch(
                "SELECT * FROM transactions WHERE sender_toshi_id = $1",
                FAUCET_ADDRESS)

            self.assertEqual(len(row), 0)

            row = await con.fetch(
                "SELECT * FROM transactions WHERE sender_toshi_id = $1",
                TEST_ADDRESS_2)

            self.assertEqual(len(row), 1)
            self.assertEqual(row[0]['from_address'], FAUCET_ADDRESS)

        await self.wait_on_tx_confirmation(tx_hash)
Esempio n. 4
0
    async def test_report_user(self):

        resp = await self.fetch_signed("/report", signing_key=TEST_PRIVATE_KEY, method="POST",
                                       body={'toshi_id': TEST_ADDRESS_2})
        self.assertResponseCodeEqual(resp, 204)

        # ensure we get two tracking events
        e1 = await self.next_tracking_event()
        e2 = await self.next_tracking_event()
        if e1[0] != encode_id(TEST_ADDRESS):
            e1, e2 = e2, e1
        self.assertEqual(e1[1], "Made report")
        self.assertEqual(e2[1], "Was reported")

        async with self.pool.acquire() as con:
            row = await con.fetch("SELECT * FROM reports WHERE reporter_toshi_id = $1", TEST_ADDRESS)

        self.assertEqual(len(row), 1)
        self.assertEqual(row[0]['details'], None)

        resp = await self.fetch_signed("/report", signing_key=TEST_PRIVATE_KEY, method="POST",
                                       body={'toshi_id': TEST_ADDRESS_2})
        self.assertResponseCodeEqual(resp, 204)

        async with self.pool.acquire() as con:
            row = await con.fetch("SELECT * FROM reports WHERE reporter_toshi_id = $1", TEST_ADDRESS)

        self.assertEqual(len(row), 2)

        resp = await self.fetch_signed("/report", signing_key=TEST_PRIVATE_KEY, method="POST",
                                       body={'toshi_id': TEST_ADDRESS_3, 'details': ''})
        self.assertResponseCodeEqual(resp, 204)

        async with self.pool.acquire() as con:
            row = await con.fetch("SELECT * FROM reports WHERE reportee_toshi_id = $1", TEST_ADDRESS_3)

        self.assertEqual(len(row), 1)
        self.assertEqual(row[0]['details'], '')
Esempio n. 5
0
    async def test_create_user(self):

        resp = await self.fetch("/timestamp")
        self.assertEqual(resp.code, 200)

        resp = await self.fetch_signed("/user", signing_key=TEST_PRIVATE_KEY, method="POST",
                                       body={'payment_address': TEST_PAYMENT_ADDRESS})

        self.assertResponseCodeEqual(resp, 200)

        body = json_decode(resp.body)

        self.assertEqual(body['toshi_id'], TEST_ADDRESS)

        async with self.pool.acquire() as con:
            row = await con.fetchrow("SELECT * FROM users WHERE toshi_id = $1", TEST_ADDRESS)

        self.assertIsNotNone(row)
        self.assertFalse(row['is_bot'])

        self.assertIsNotNone(row['username'])

        self.assertIsNotNone(row['avatar'])
        self.assertIsNotNone(
            regex.match("\/[^\/]+\/public\/identicon\/{}\.png".format(TEST_PAYMENT_ADDRESS),
                        urllib.parse.urlparse(row['avatar']).path), row['avatar'])

        async with self.boto:
            objs = await self.boto.list_objects()
        self.assertIn('Contents', objs)
        self.assertEqual(len(objs['Contents']), 1)

        resp = await self.fetch(row['avatar'], method="GET")
        self.assertEqual(resp.code, 200, "Got unexpected {} for url: {}".format(resp.code, row['avatar']))

        # ensure we got a tracking event
        self.assertEqual((await self.next_tracking_event())[0], encode_id(TEST_ADDRESS))
Esempio n. 6
0
    async def test_create_user_with_username(self):

        username = "******"

        body = {
            "username": username,
            "payment_address": TEST_PAYMENT_ADDRESS,
            "name": "Bob Smith"
        }

        resp = await self.fetch_signed("/user", signing_key=TEST_PRIVATE_KEY, method="POST", body=body)

        self.assertResponseCodeEqual(resp, 200)

        async with self.pool.acquire() as con:

            row = await con.fetchrow("SELECT * FROM users WHERE username = $1", username)

        self.assertIsNotNone(row)

        self.assertEqual(row['username'], username)

        # ensure we got a tracking event
        self.assertEqual((await self.next_tracking_event())[0], encode_id(TEST_ADDRESS))
Esempio n. 7
0
    async def test_update_user_avatar(self):

        capitalised = 'BobSmith'

        async with self.pool.acquire() as con:
            await con.execute(
                "INSERT INTO users (username, toshi_id) VALUES ($1, $2)",
                capitalised, TEST_ADDRESS)

        boundary = uuid4().hex
        headers = {
            'Content-Type': 'multipart/form-data; boundary={}'.format(boundary)
        }
        png = blockies.create(TEST_PAYMENT_ADDRESS,
                              size=8,
                              scale=12,
                              format='PNG')
        files = [('image.png', png)]
        body = body_producer(boundary, files)

        resp = await self.fetch_signed("/user",
                                       signing_key=TEST_PRIVATE_KEY,
                                       method="PUT",
                                       body=body,
                                       headers=headers)

        self.assertResponseCodeEqual(resp, 200)

        async with self.pool.acquire() as con:
            urow = await con.fetchrow(
                "SELECT * FROM users WHERE toshi_id = $1", TEST_ADDRESS)

        self.assertIsNotNone(urow)
        self.assertIsNotNone(urow['avatar'])
        self.assertIsNotNone(
            regex.match(
                "\/[^\/]+\/public\/avatar\/{}_[a-f0-9]{{{}}}\.png".format(
                    TEST_ADDRESS, AVATAR_URL_HASH_LENGTH),
                urllib.parse.urlparse(urow['avatar']).path), urow['avatar'])

        first_avatar_url = urow['avatar']
        resp = await self.fetch(first_avatar_url, method="GET")
        self.assertEqual(
            resp.code, 200,
            "Got unexpected {} for url: {}".format(resp.code,
                                                   first_avatar_url))
        # easy to test png, it doesn't change so easily when "double" saved
        self.assertEqual(resp.body, png)
        self.assertIn('Etag', resp.headers)
        last_etag = resp.headers['Etag']
        self.assertIn('Last-Modified', resp.headers)
        last_modified = resp.headers['Last-Modified']

        # try update with jpeg
        jpeg = blockies.create(TEST_ADDRESS_2, size=8, scale=12, format='JPEG')
        # rotate jpeg
        # TODO: figure out if there's actually a way to test that
        # this is working as expected
        jpeg = Image.open(BytesIO(jpeg)).rotate(90)
        stream = BytesIO()
        # generate exif info for rotation
        exif_dict = {
            "0th": {
                piexif.ImageIFD.XResolution: (jpeg.size[0], 1),
                piexif.ImageIFD.YResolution: (jpeg.size[1], 1),
                piexif.ImageIFD.Orientation: 8
            }
        }
        jpeg.save(stream, format="JPEG", exif=piexif.dump(exif_dict))
        jpeg = stream.getbuffer().tobytes()
        files = [('image.jpg', jpeg)]
        body = body_producer(boundary, files)
        resp = await self.fetch_signed("/user",
                                       signing_key=TEST_PRIVATE_KEY,
                                       method="PUT",
                                       body=body,
                                       headers=headers)
        self.assertResponseCodeEqual(resp, 200)

        # ensure we got a tracking event
        self.assertEqual((await self.next_tracking_event())[0],
                         encode_id(TEST_ADDRESS))

        async with self.pool.acquire() as con:
            urow = await con.fetchrow(
                "SELECT * FROM users WHERE toshi_id = $1", TEST_ADDRESS)
        self.assertIsNotNone(urow)
        self.assertIsNotNone(urow['avatar'])
        self.assertIsNotNone(
            regex.match(
                "\/[^\/]+\/public\/avatar\/{}_[a-f0-9]{{{}}}\.jpg".format(
                    TEST_ADDRESS, AVATAR_URL_HASH_LENGTH),
                urllib.parse.urlparse(urow['avatar']).path))
        jpg_avatar_url = urow['avatar']

        resp = await self.fetch(jpg_avatar_url,
                                method="GET",
                                headers={
                                    'If-None-Match': last_etag,
                                    'If-Modified-Since': last_modified
                                })
        self.assertResponseCodeEqual(resp, 200)
        # it's impossible to compare the jpegs after being saved a 2nd time
        # so i simply make sure the value isn't the same as the png
        self.assertNotEqual(resp.body, png)

        # check for 304 when trying with new values
        # NOTE (TODO): moto_server doesn't return 304, but s3 itself does
        # resp304 = await self.fetch(jpg_avatar_url, method="GET", headers={
        #     'If-None-Match': resp.headers['Etag'],
        #     'If-Modified-Since': resp.headers['Last-Modified']
        # })
        # self.assertResponseCodeEqual(resp304, 304)

        # check that avatar stays after other update
        presp = await self.fetch_signed("/user",
                                        signing_key=TEST_PRIVATE_KEY,
                                        method="PUT",
                                        body={
                                            "username": "******",
                                            "name": "Jamie"
                                        })
        self.assertResponseCodeEqual(presp, 200)
        data = json_decode(presp.body)
        self.assertEqual(data['avatar'], jpg_avatar_url)

        # make sure the original url is still available
        resp = await self.fetch(first_avatar_url, method="GET")
        self.assertResponseCodeEqual(resp, 200)
        self.assertEqual(resp.body, png)

        async with self.boto:
            objs = await self.boto.list_objects()
        self.assertIn('Contents', objs)
        self.assertEqual(len(objs['Contents']), 2)
 def test_encode_id(self):
     digest = analytics.encode_id(TEST_ADDRESS)
     self.assertEqual(TEST_ADDRESS_DIGEST, digest)