Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fix: use sender name with from email in ses provider #2226

Merged
merged 2 commits into from
Dec 12, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ export class SESHandler extends BaseHandler {
region: credentials.region,
accessKeyId: credentials.apiKey,
secretAccessKey: credentials.secretKey,
senderName: credentials.senderName ?? 'no-reply',
from,
};

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ export class SESHandler extends BaseHandler {
region: credentials.region,
accessKeyId: credentials.apiKey,
secretAccessKey: credentials.secretKey,
senderName: credentials.senderName ?? 'no-reply',
from,
};

Expand Down
3 changes: 2 additions & 1 deletion providers/ses/src/lib/ses.config.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,8 @@
// eslint-disable-next-line @typescript-eslint/naming-convention
export interface SESConfig {
from: string;
region: string;
senderName: string;
accessKeyId: string;
secretAccessKey: string;
from: string;
}
5 changes: 3 additions & 2 deletions providers/ses/src/lib/ses.provider.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -11,10 +11,11 @@ test('should trigger ses library correctly', async () => {
});

const mockConfig = {
from: 'test@test.com',
region: 'test-1',
senderName: 'Test',
accessKeyId: 'TEST',
from: 'test@test.com',
Comment on lines +14 to +17
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

In the line 32 of this file when testing if the SES client has been called, could we also double check with what payload is being called? Right now we only check the spy is being called.
This would help to have more confidence that we are passing the sender name and the rest of values properly to the client. What do you think?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hi @p-fernandez!!

Apparently who we called to actually send the message is a nodemailer transporter created on top of the SES client, I was in doubt about how this test could be done and I decided to add a false object as follows: expect(spySesSend).toHaveBeenCalledWith({});

for it to return what the nodemailer sends to the send method of the SES client, I was surprised and found it strange when I came across the following return

Captura de tela de 2022-12-08 18-51-46
Captura de tela de 2022-12-08 18-51-55
What is strange about this object is its Source property, this should contain the sender name like
Source: 'Sender Name', however, it is getting the data from from.

I thought it was a bit bad to create the test this way, a suggestion I can give is that inside the ses.provider.ts file the ses transporter becomes a property in the SESMailProvider class, after that we can check if its sendMail method is called with the correct parameters

Example:

constructor(private readonly config: SESConfig) {
    const ses = new SESClient({
      region: this.config.region,
      credentials: {
        accessKeyId: this.config.accessKeyId,
        secretAccessKey: this.config.secretAccessKey,
      },
    });
    
    this.transporter = nodemailer.createTransport({
      SES: { ses: this.ses, aws: { SendRawEmailCommand } },
    });
  }
const spySendMail = jest.spyOn(provider.transporter, 'sendMail');
expect(spySendMail).toHaveBeenCalledWith({
      to,
      html,
      text,
      subject,
      attachments,
      from: {
        address: from,
        name: this.config.senderName,
      },
    })

secretAccessKey: 'TEST',
region: 'test-1',
};
const provider = new SESEmailProvider(mockConfig);

Expand Down
7 changes: 5 additions & 2 deletions providers/ses/src/lib/ses.provider.ts
Original file line number Diff line number Diff line change
Expand Up @@ -31,12 +31,15 @@ export class SESEmailProvider implements IEmailProvider {
});

return await transporter.sendMail({
to,
html,
text,
to,
from,
subject,
attachments,
from: {
address: from,
name: this.config.senderName,
},
});
}

Expand Down