Ghost/ghost/core/test/unit/server/services
Simon Backx a7b583050c
Added link tracking to paywall (#15414)
closes https://github.com/TryGhost/Team/issues/1908

### Problem:
- We need tracking on the paywall links in each email. (we cannot ignore them because those buttons are probably gonna have a higher paid conversion attribution than others).
- Currently we only add the paywall HTML to an email when processing each batch. So if we batch an email to 1.000 recipients per 100, we'll generate the paywall HTML 10 times. 
- We cannot replace links in `renderEmailForSegment` because that methods will get called multiple times. We don't want to have multiple redirect instances created for the same link in the same email.

###  Solution:
- Move the generation of the paywall to the `serialize` method of the post email serializer.
- Surround the generated paywall with HTML-comments so we can remove it if required in `renderEmailForSegment` depending on the member segment we are sending the email to.

---

### Before:

**Serialize output:**
```html
<html>
    <body>
        <h1>Generated email header</h1>
        <p>Generated text</p>

        <div>
            <!-- POST CONTENT START -->
                <h1>Post title</h1>
                <p>Content visible for all members</p>
            <!--members-only-->
                <p>Content visible for paid members only</p>
            <!-- POST CONTENT END -->
        </div>
    </body>
</html>
```

To be modified later by  `renderEmailForSegment`:

**Paid members (nothing changed):**
```html
<html>
    <body>
        <h1>Generated email header</h1>
        <p>Generated text</p>

        <div>
            <!-- POST CONTENT START -->
                <h1>Post title</h1>
                <p>Content visible for all members</p>
            <!--members-only-->
                <p>Content visible for paid members only</p>
            <!-- POST CONTENT END -->
        </div>
    </body>
</html>
```

**Free members (paywall _added_):**
```html
<html>
    <body>
        <h1>Generated email header</h1>
        <p>Generated text</p>

        <div>
            <!-- POST CONTENT START -->
                <h1>Post title</h1>
                <p>Content visible for all members</p>
                <h2>Generated paywall here</h2>
                <a href="https://subscribe.com">Subscribe to read the full post</a>
            <!-- POST CONTENT END -->
        </div>
    </body>
</html>
```

### After this change:

**Serialize output:**
```html
<html>
    <body>
        <h1>Generated email header</h1>
        <p>Generated text</p>

        <div>
            <!-- POST CONTENT START -->
                <h1>Post title</h1>
                <p>Content visible for all members</p>
            <!--members-only-->
                <p>Content visible for paid members only</p>
             <!-- PAYWALL -->
                <h2>Generated paywall here</h2>
                <a href="https://subscribe.com/?tracked">Subscribe to read the full post</a>
            <!-- POST CONTENT END -->
        </div>
    </body>
</html>
```

To be modified later by  `renderEmailForSegment`:

**Paid members (paywall removed):**
```html
<html>
    <body>
        <h1>Generated email header</h1>
        <p>Generated text</p>

        <div>
            <!-- POST CONTENT START -->
                <h1>Post title</h1>
                <p>Content visible for all members</p>
            <!--members-only-->
                <p>Content visible for paid members only</p>
            <!-- POST CONTENT END -->
        </div>
    </body>
</html>
```

**Free members (members-only content removed):**
```html
<html>
    <body>
        <h1>Generated email header</h1>
        <p>Generated text</p>

        <div>
            <!-- POST CONTENT START -->
                <h1>Post title</h1>
                <p>Content visible for all members</p>
            <!-- PAYWALL -->
                <h2>Generated paywall here</h2>
                <a href="https://subscribe.com/?tracked">Subscribe to read the full post</a>
            <!-- POST CONTENT END -->
        </div>
    </body>
</html>
```
2022-09-16 10:08:12 +02:00
..
adapter-manager Added JSDoc to adapter options resolver 2022-09-06 17:51:57 +08:00
api-version-compatibility Converted Ghost repo into a monorepo 2022-07-20 16:41:05 +02:00
auth Converted Ghost repo into a monorepo 2022-07-20 16:41:05 +02:00
custom-redirects Renamed redirects to custom-redirects 2022-09-14 13:24:17 -04:00
frontend-data-service Converted Ghost repo into a monorepo 2022-07-20 16:41:05 +02:00
mail Converted Ghost repo into a monorepo 2022-07-20 16:41:05 +02:00
mega Added link tracking to paywall (#15414) 2022-09-16 10:08:12 +02:00
members Replaced all 'bio' references with 'expertise' for member comments. (#15359) 2022-09-09 10:14:49 +02:00
newsletters Converted Ghost repo into a monorepo 2022-07-20 16:41:05 +02:00
notifications Converted Ghost repo into a monorepo 2022-07-20 16:41:05 +02:00
permissions Removed defunct applyPublicRules code 2022-09-09 17:14:15 +01:00
posts Converted Ghost repo into a monorepo 2022-07-20 16:41:05 +02:00
route-settings Converted Ghost repo into a monorepo 2022-07-20 16:41:05 +02:00
settings Converted Ghost repo into a monorepo 2022-07-20 16:41:05 +02:00
settings-helpers 🐛 Fixed sending emails from email domain that includes www subdomain (#15348) 2022-09-02 16:57:59 +02:00
staff Updated staff service to trigger alerts via events 2022-09-10 11:06:34 +05:30
stripe Removed apiVersions from test urlUtils 2022-09-09 13:32:30 +01:00
themes Converted Ghost repo into a monorepo 2022-07-20 16:41:05 +02:00
url Converted Ghost repo into a monorepo 2022-07-20 16:41:05 +02:00
users Converted Ghost repo into a monorepo 2022-07-20 16:41:05 +02:00
webhooks Converted Ghost repo into a monorepo 2022-07-20 16:41:05 +02:00
labs.test.js Converted Ghost repo into a monorepo 2022-07-20 16:41:05 +02:00
limits.test.js Converted Ghost repo into a monorepo 2022-07-20 16:41:05 +02:00
nft-oembed.test.js 🐛 Fixed OpenSea NFT OEmbeds (#15372) 2022-09-06 11:29:35 -04:00
slack.test.js Converted Ghost repo into a monorepo 2022-07-20 16:41:05 +02:00
xmlrpc.test.js Converted Ghost repo into a monorepo 2022-07-20 16:41:05 +02:00