diff --git a/packages/component-fixture-manager/src/fixtures/collectionIDs.js b/packages/component-fixture-manager/src/fixtures/collectionIDs.js
index 5b0da41bf1758f75c2b1394ca7f42ef812761ccc..89a73a932016fa0da4997206e1ca2b210c1996d1 100644
--- a/packages/component-fixture-manager/src/fixtures/collectionIDs.js
+++ b/packages/component-fixture-manager/src/fixtures/collectionIDs.js
@@ -7,4 +7,5 @@ module.exports = {
   collectionReviewCompletedID: chance.guid(),
   collectionNoInvitesID: chance.guid(),
   twoVersionsCollectionId: chance.guid(),
+  oneReviewedFragmentCollectionID: chance.guid(),
 }
diff --git a/packages/component-fixture-manager/src/fixtures/collections.js b/packages/component-fixture-manager/src/fixtures/collections.js
index d982f643c675c55a73ce3a1a4b57289935a9556b..04824e80c984424b6c024e4897423990d117f2e1 100644
--- a/packages/component-fixture-manager/src/fixtures/collections.js
+++ b/packages/component-fixture-manager/src/fixtures/collections.js
@@ -11,6 +11,7 @@ const {
   collectionReviewCompletedID,
   collectionNoInvitesID,
   twoVersionsCollectionId,
+  oneReviewedFragmentCollectionID,
 } = require('./collectionIDs')
 
 const chance = new Chance()
@@ -214,6 +215,36 @@ const collections = {
     save: jest.fn(() => collections.collection),
     customId: chance.natural({ min: 999999, max: 9999999 }),
   },
+  oneReviewedFragmentCollection: {
+    id: oneReviewedFragmentCollectionID,
+    title: chance.sentence(),
+    type: 'collection',
+    fragments: [reviewCompletedFragment.id, noInvitesFragment.id],
+    owners: [user.id],
+    save: jest.fn(() => collections.collection),
+    invitations: [
+      {
+        id: chance.guid(),
+        role: 'handlingEditor',
+        hasAnswer: true,
+        isAccepted: false,
+        userId: handlingEditor.id,
+        invitedOn: chance.timestamp(),
+        respondedOn: null,
+      },
+    ],
+    handlingEditor: {
+      id: handlingEditor.id,
+      hasAnswer: false,
+      isAccepted: false,
+      email: handlingEditor.email,
+      invitedOn: chance.timestamp(),
+      respondedOn: null,
+      name: `${handlingEditor.firstName} ${handlingEditor.lastName}`,
+    },
+    status: 'revisionRequested',
+    customId: chance.natural({ min: 999999, max: 9999999 }),
+  },
 }
 
 module.exports = collections
diff --git a/packages/component-fixture-manager/src/fixtures/fragments.js b/packages/component-fixture-manager/src/fixtures/fragments.js
index 9fca41e0ffba404be7fd612dd6feb483e6a23763..3978fd6ab4201a6f8223f9f8c9cf1ffff665d57e 100644
--- a/packages/component-fixture-manager/src/fixtures/fragments.js
+++ b/packages/component-fixture-manager/src/fixtures/fragments.js
@@ -265,6 +265,7 @@ const fragments = {
         invitedOn: chance.timestamp(),
         isAccepted: true,
         respondedOn: chance.timestamp(),
+        reviewerNumber: 2,
       },
       {
         id: chance.guid(),
diff --git a/packages/component-helper-service/src/services/Collection.js b/packages/component-helper-service/src/services/Collection.js
index 76cea5e6211b22b2347b02a09ef76a685ee08f74..5bfe4ca8e0baf75b49789404eb07e171412474c7 100644
--- a/packages/component-helper-service/src/services/Collection.js
+++ b/packages/component-helper-service/src/services/Collection.js
@@ -108,7 +108,7 @@ class Collection {
 
   async getAllCollectionFragments({ FragmentModel }) {
     const allCollectionFragments = await Promise.all(
-      this.collection.fragments.map(async fragmentId => {
+      get(this.collection, 'fragments', []).map(async fragmentId => {
         const fragment = await FragmentModel.find(fragmentId)
         return fragment
       }),
@@ -116,47 +116,25 @@ class Collection {
     return allCollectionFragments
   }
 
-  async getAllCollectionInvitations({ FragmentModel }) {
+  async getReviewerNumber({ reqUser, FragmentModel }) {
     const allCollectionFragments = await this.getAllCollectionFragments({
       FragmentModel,
     })
     const allCollectionInvitations = flatten(
       allCollectionFragments.map(fragment => fragment.invitations),
     )
-    return allCollectionInvitations
-  }
-
-  async getAllNumberedInvitationsForUser({ reqUser, FragmentModel }) {
-    const allCollectionInvitations = await this.getAllCollectionInvitations({
-      FragmentModel,
-    })
-    return allCollectionInvitations
+    const allNumberedInvitationsForUser = allCollectionInvitations
       .filter(invite => invite.userId === reqUser.id)
       .filter(invite => invite.reviewerNumber)
-  }
-
-  async getMaxReviewerNumber({ FragmentModel }) {
-    const allCollectionInvitations = await this.getAllCollectionInvitations({
-      FragmentModel,
-    })
-    const maxReviewerNumber = get(
-      maxBy(allCollectionInvitations, 'reviewerNumber'),
-      'reviewerNumber',
-      0,
-    )
-    return maxReviewerNumber
-  }
 
-  async getReviewerNumber({ reqUser, FragmentModel }) {
-    // maybe i should get fragments here and pass them further
-    const allNumberedInvitationsForUser = await this.getAllNumberedInvitationsForUser(
-      {
-        reqUser,
-        FragmentModel,
-      },
-    )
-    if (isEmpty(allNumberedInvitationsForUser))
-      return this.getMaxReviewerNumber() + 1
+    if (isEmpty(allNumberedInvitationsForUser)) {
+      const maxReviewerNumber = get(
+        maxBy(allCollectionInvitations, 'reviewerNumber'),
+        'reviewerNumber',
+        0,
+      )
+      return maxReviewerNumber + 1
+    }
     return allNumberedInvitationsForUser[0].reviewerNumber
   }
 }
diff --git a/packages/component-helper-service/src/tests/collection.test.js b/packages/component-helper-service/src/tests/collection.test.js
new file mode 100644
index 0000000000000000000000000000000000000000..fb921025d2f211c198e077e32b141e7ab146eb42
--- /dev/null
+++ b/packages/component-helper-service/src/tests/collection.test.js
@@ -0,0 +1,111 @@
+process.env.NODE_TLS_REJECT_UNAUTHORIZED = '0'
+process.env.SUPPRESS_NO_CONFIG_WARNING = true
+
+const { cloneDeep } = require('lodash')
+const fixturesService = require('pubsweet-component-fixture-service')
+
+const { fixtures, Model } = fixturesService
+const { Collection } = require('../Helper')
+
+describe('Collection helper', () => {
+  let testFixtures = {}
+  let models
+  beforeEach(() => {
+    testFixtures = cloneDeep(fixtures)
+    models = Model.build(testFixtures)
+  })
+
+  describe('getAllCollectionFragments', () => {
+    it('should return an array with all collection fragments', async () => {
+      const { collection } = testFixtures.collections
+      const collectionHelper = new Collection({ collection })
+      const FragmentModel = models.Fragment
+
+      const numberOfFragments = collection.fragments.length
+      const allCollectionFragments = await collectionHelper.getAllCollectionFragments(
+        {
+          FragmentModel,
+        },
+      )
+
+      expect(allCollectionFragments).toHaveLength(numberOfFragments)
+      expect(typeof allCollectionFragments[0]).toBe('object')
+      expect(allCollectionFragments[0].type).toBe('fragment')
+    })
+    it('should return an empty array when no fragments exist', async () => {
+      const { noFragmentsCollection } = testFixtures.collections
+      const collectionHelper = new Collection({ noFragmentsCollection })
+      const FragmentModel = models.Fragment
+
+      const allCollectionFragments = await collectionHelper.getAllCollectionFragments(
+        {
+          FragmentModel,
+        },
+      )
+
+      expect(allCollectionFragments).toHaveLength(0)
+      expect(typeof allCollectionFragments[0]).toBe('undefined')
+    })
+  })
+
+  describe('getReviewerNumber', () => {
+    it('should assign reviewer number 1 on invitation if no other reviewer numbers exist', async () => {
+      const { collection } = testFixtures.collections
+      const { reviewer } = testFixtures.users
+      const collectionHelper = new Collection({ collection })
+      const FragmentModel = models.Fragment
+
+      const reviewerNumber = await collectionHelper.getReviewerNumber({
+        reqUser: reviewer,
+        FragmentModel,
+      })
+
+      expect(reviewerNumber).toBe(1)
+    })
+    it('should assign next reviewer number on invitation if another reviewer numbers exist', async () => {
+      const { collectionReviewCompleted } = testFixtures.collections
+      const { reviewer } = testFixtures.users
+      const collectionHelper = new Collection({
+        collection: collectionReviewCompleted,
+      })
+      const FragmentModel = models.Fragment
+
+      const reviewerNumber = await collectionHelper.getReviewerNumber({
+        reqUser: reviewer,
+        FragmentModel,
+      })
+
+      expect(reviewerNumber).toBe(3)
+    })
+    it('should keep reviewer number across fragment versions', async () => {
+      const { oneReviewedFragmentCollection } = testFixtures.collections
+      const { answerReviewer } = testFixtures.users
+      const collectionHelper = new Collection({
+        collection: oneReviewedFragmentCollection,
+      })
+      const FragmentModel = models.Fragment
+
+      const reviewerNumber = await collectionHelper.getReviewerNumber({
+        reqUser: answerReviewer,
+        FragmentModel,
+      })
+
+      expect(reviewerNumber).toBe(2)
+    })
+    it('should assign next reviewer number across fragment versions', async () => {
+      const { oneReviewedFragmentCollection } = testFixtures.collections
+      const { reviewer } = testFixtures.users
+      const collectionHelper = new Collection({
+        collection: oneReviewedFragmentCollection,
+      })
+      const FragmentModel = models.Fragment
+
+      const reviewerNumber = await collectionHelper.getReviewerNumber({
+        reqUser: reviewer,
+        FragmentModel,
+      })
+
+      expect(reviewerNumber).toBe(3)
+    })
+  })
+})