def test_create_draft_with_attachments(api_client, attachments, example_draft): attachment_ids = [] upload_path = '/files' for filename, path in attachments: data = {'file': (open(path, 'rb'), filename)} r = api_client.post_raw(upload_path, data=data) assert r.status_code == 200 attachment_id = json.loads(r.data)[0]['id'] attachment_ids.append(attachment_id) first_attachment = attachment_ids.pop() example_draft['file_ids'] = [first_attachment] r = api_client.post_data('/drafts', example_draft) assert r.status_code == 200 returned_draft = json.loads(r.data) draft_public_id = returned_draft['id'] assert returned_draft['version'] == 0 example_draft['version'] = returned_draft['version'] assert len(returned_draft['files']) == 1 attachment_ids.append(first_attachment) example_draft['file_ids'] = attachment_ids r = api_client.put_data('/drafts/{}'.format(draft_public_id), example_draft) assert r.status_code == 200 returned_draft = json.loads(r.data) assert len(returned_draft['files']) == 3 assert returned_draft['version'] == 1 example_draft['version'] = returned_draft['version'] # Make sure we can't delete the files now for file_id in attachment_ids: r = api_client.delete('/files/{}'.format(file_id)) assert r.status_code == 400 # Now remove the attachment example_draft['file_ids'] = [first_attachment] r = api_client.put_data('/drafts/{}'.format(draft_public_id), example_draft) draft_data = api_client.get_data('/drafts/{}'.format(draft_public_id)) assert len(draft_data['files']) == 1 assert draft_data['version'] == 2 example_draft['version'] = draft_data['version'] example_draft['file_ids'] = [] r = api_client.put_data('/drafts/{}'.format(draft_public_id), example_draft) draft_data = api_client.get_data('/drafts/{}'.format(draft_public_id)) assert r.status_code == 200 assert len(draft_data['files']) == 0 assert draft_data['version'] == 3 # now that they're not attached, we should be able to delete them for file_id in attachment_ids: r = api_client.delete('/files/{}'.format(file_id)) assert r.status_code == 200
def test_latest_cursor(api_client): time.sleep(5) now = int(time.time()) latest_cursor_resp = api_client.post_raw('/delta/latest_cursor', None) latest_cursor = json.loads(latest_cursor_resp.data)['cursor'] now_cursor = get_cursor(api_client, now) assert latest_cursor == now_cursor
def test_sending_raw_mime(patch_smtp, api_client): api_client.post_raw( "/send", ("From: [email protected]\r\n" "To: golang-nuts " "<*****@*****.**>\r\n" "Cc: [email protected]\r\n" "Bcc: Some Guy <*****@*****.**>\r\n" "Subject: " "[go-nuts] Runtime Panic On Method Call" "\r\n" "Mime-Version: 1.0\r\n" "In-Reply-To: " "<78pgxboai332pi9p2smo4db73-0" "@mailer.nylas.com>\r\n" "References: " "<78pgxboai332pi9p2smo4db73-0" "@mailer.nylas.com>\r\n" "Content-Type: text/plain; charset=UTF-8" "\r\n" "Content-Transfer-Encoding: 7bit\r\n" "X-My-Custom-Header: Random\r\n\r\n" "Yo."), headers={"Content-Type": "message/rfc822"}, ) _, msg = patch_smtp[-1] parsed = mime.from_string(msg) assert parsed.body == "Yo." assert parsed.headers["From"] == "*****@*****.**" assert parsed.headers[ "Subject"] == "[go-nuts] Runtime Panic On Method Call" assert parsed.headers["Cc"] == "*****@*****.**" assert parsed.headers["To"] == "golang-nuts <*****@*****.**>" assert (parsed.headers["In-Reply-To"] == "<*****@*****.**>") assert (parsed.headers["References"] == "<*****@*****.**>") assert parsed.headers["X-My-Custom-Header"] == "Random" assert "Bcc" not in parsed.headers assert "X-INBOX-ID" in parsed.headers assert "Message-Id" in parsed.headers assert "User-Agent" in parsed.headers
def test_latest_cursor(api_client): with freeze_time(datetime.datetime.utcnow()) as freezer: freezer.tick(datetime.timedelta(seconds=5)) now = int(time.time()) latest_cursor_resp = api_client.post_raw("/delta/latest_cursor", None) latest_cursor = json.loads(latest_cursor_resp.data)["cursor"] now_cursor = get_cursor(api_client, now) assert latest_cursor == now_cursor
def test_latest_cursor(api_client): with freeze_time(datetime.datetime.utcnow()) as freezer: freezer.tick(datetime.timedelta(seconds=5)) now = int(time.time()) latest_cursor_resp = api_client.post_raw('/delta/latest_cursor', None) latest_cursor = json.loads(latest_cursor_resp.data)['cursor'] now_cursor = get_cursor(api_client, now) assert latest_cursor == now_cursor
def test_sending_raw_mime(patch_smtp, api_client): api_client.post_raw('/send', ('From: [email protected]\r\n' 'To: golang-nuts ' '<*****@*****.**>\r\n' 'Cc: [email protected]\r\n' 'Bcc: Some Guy <*****@*****.**>\r\n' 'Subject: ' '[go-nuts] Runtime Panic On Method Call' '\r\n' 'Mime-Version: 1.0\r\n' 'In-Reply-To: ' '<78pgxboai332pi9p2smo4db73-0' '@mailer.nylas.com>\r\n' 'References: ' '<78pgxboai332pi9p2smo4db73-0' '@mailer.nylas.com>\r\n' 'Content-Type: text/plain; charset=UTF-8' '\r\n' 'Content-Transfer-Encoding: 7bit\r\n' 'X-My-Custom-Header: Random\r\n\r\n' 'Yo.'), headers={'Content-Type': 'message/rfc822'}) _, msg = patch_smtp[-1] parsed = mime.from_string(msg) assert parsed.body == 'Yo.' assert parsed.headers['From'] == '*****@*****.**' assert parsed.headers['Subject'] == \ '[go-nuts] Runtime Panic On Method Call' assert parsed.headers['Cc'] == '*****@*****.**' assert parsed.headers['To'] == \ 'golang-nuts <*****@*****.**>' assert parsed.headers['In-Reply-To'] == \ '<*****@*****.**>' assert parsed.headers['References'] == \ '<*****@*****.**>' assert parsed.headers['X-My-Custom-Header'] == 'Random' assert 'Bcc' not in parsed.headers assert 'X-INBOX-ID' in parsed.headers assert 'Message-Id' in parsed.headers assert 'User-Agent' in parsed.headers
def test_sending_bad_raw_mime(patch_smtp, api_client): res = api_client.post_raw('/send', ('From: [email protected]\r\n' 'To: \r\n' 'Subject: ' '[go-nuts] Runtime Panic On Method' 'Call \r\n' 'Mime-Version: 1.0\r\n' 'Content-Type: ' 'text/plain; charset=UTF-8\r\n' 'Content-Transfer-Encoding: 7bit\r\n' 'X-My-Custom-Header: Random' '\r\n\r\n' 'Yo.'), headers={'Content-Type': 'message/rfc822'}) assert res.status_code == 400
def uploaded_file_ids(api_client, files): file_ids = [] upload_path = '/files' for filename, path in files: # Mac and linux fight over filesystem encodings if we store this # filename on the fs. Work around by changing the filename we upload # instead. if filename == 'piece-jointe.jpg': filename = u'pièce-jointe.jpg' elif filename == 'andra-moi-ennepe.txt': filename = u'ἄνδρα μοι ἔννεπε' data = {'file': (open(path, 'rb'), filename)} r = api_client.post_raw(upload_path, data=data) assert r.status_code == 200 file_id = json.loads(r.data)[0]['id'] file_ids.append(file_id) return file_ids
def test_send_with_event_and_attachments(patch_smtp, api_client, example_draft, event, attachments): msgs = patch_smtp # Load and post file for attachment filename, path = attachments[0] data = {'file': (open(path, 'rb'), filename)} r = api_client.post_raw('/files', data=data) assert r.status_code == 200 attachment_id = json.loads(r.data)[0]['id'] # Add attachment to the new draft and post the draft example_draft['file_ids'] = [attachment_id] r = api_client.post_data('/drafts', example_draft) assert r.status_code == 200 returned_draft = json.loads(r.data) draft_public_id = returned_draft['id'] version = returned_draft['version'] # Send the draft along with an event ID to use for invites r = api_client.post_data('/send', {'draft_id': draft_public_id, 'version': version, 'event_id': event.public_id}) assert r.status_code == 200 # Make sure one message was sent assert len(msgs) == 1 recipients, raw_msg = msgs[0] msg = mime.from_string(raw_msg) # Check the MIME body of the message to make sure both the event and the # attachment are there parts = [] for mimepart in msg.walk(with_self=msg.content_type.is_singlepart()): is_attachment = mimepart.is_attachment() format_type = mimepart.content_type.format_type subtype = mimepart.content_type.subtype parts.append((format_type, subtype, is_attachment)) assert ('text', 'plain', False) in parts assert ('text', 'html', False) in parts assert ('text', 'calendar', False) in parts assert ('image', 'jpeg', True) in parts
def test_sending_bad_raw_mime(patch_smtp, api_client): res = api_client.post_raw( "/send", ("From: [email protected]\r\n" "To: \r\n" "Subject: " "[go-nuts] Runtime Panic On Method" "Call \r\n" "Mime-Version: 1.0\r\n" "Content-Type: " "text/plain; charset=UTF-8\r\n" "Content-Transfer-Encoding: 7bit\r\n" "X-My-Custom-Header: Random" "\r\n\r\n" "Yo."), headers={"Content-Type": "message/rfc822"}, ) assert res.status_code == 400