asset-channel.e2e-spec.ts 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294
  1. /* tslint:disable:no-non-null-assertion */
  2. import { createTestEnvironment, E2E_DEFAULT_CHANNEL_TOKEN } from '@vendure/testing';
  3. import gql from 'graphql-tag';
  4. import path from 'path';
  5. import { initialData } from '../../../e2e-common/e2e-initial-data';
  6. import { testConfig, TEST_SETUP_TIMEOUT_MS } from '../../../e2e-common/test-config';
  7. import { DefaultLogger, LogLevel } from '../src/config';
  8. import { ASSET_FRAGMENT } from './graphql/fragments';
  9. import {
  10. AssignAssetsToChannel,
  11. AssignProductsToChannel,
  12. CreateAssets,
  13. CreateChannel,
  14. CurrencyCode,
  15. DeleteAsset,
  16. DeletionResult,
  17. GetAsset,
  18. GetProductWithVariants,
  19. LanguageCode,
  20. UpdateProduct,
  21. } from './graphql/generated-e2e-admin-types';
  22. import {
  23. ASSIGN_PRODUCT_TO_CHANNEL,
  24. CREATE_ASSETS,
  25. CREATE_CHANNEL,
  26. DELETE_ASSET,
  27. GET_ASSET,
  28. GET_PRODUCT_WITH_VARIANTS,
  29. UPDATE_PRODUCT,
  30. } from './graphql/shared-definitions';
  31. import { assertThrowsWithMessage } from './utils/assert-throws-with-message';
  32. const { server, adminClient } = createTestEnvironment(testConfig());
  33. const SECOND_CHANNEL_TOKEN = 'second_channel_token';
  34. let createdAssetId: string;
  35. let channel2Id: string;
  36. let featuredAssetId: string;
  37. beforeAll(async () => {
  38. await server.init({
  39. initialData,
  40. productsCsvPath: path.join(__dirname, 'fixtures/e2e-products-full.csv'),
  41. customerCount: 1,
  42. });
  43. await adminClient.asSuperAdmin();
  44. const { createChannel } = await adminClient.query<CreateChannel.Mutation, CreateChannel.Variables>(
  45. CREATE_CHANNEL,
  46. {
  47. input: {
  48. code: 'second-channel',
  49. token: SECOND_CHANNEL_TOKEN,
  50. defaultLanguageCode: LanguageCode.en,
  51. currencyCode: CurrencyCode.GBP,
  52. pricesIncludeTax: true,
  53. defaultShippingZoneId: 'T_1',
  54. defaultTaxZoneId: 'T_1',
  55. },
  56. },
  57. );
  58. channel2Id = createChannel.id;
  59. }, TEST_SETUP_TIMEOUT_MS);
  60. afterAll(async () => {
  61. await server.destroy();
  62. });
  63. describe('ChannelAware Assets', () => {
  64. it('Create asset in default channel', async () => {
  65. const filesToUpload = [path.join(__dirname, 'fixtures/assets/pps2.jpg')];
  66. const { createAssets }: CreateAssets.Mutation = await adminClient.fileUploadMutation({
  67. mutation: CREATE_ASSETS,
  68. filePaths: filesToUpload,
  69. mapVariables: filePaths => ({
  70. input: filePaths.map(p => ({ file: null })),
  71. }),
  72. });
  73. expect(createAssets.length).toBe(1);
  74. createdAssetId = createAssets[0].id;
  75. expect(createdAssetId).toBeDefined();
  76. });
  77. it('Get asset from default channel', async () => {
  78. const { asset } = await adminClient.query<GetAsset.Query, GetAsset.Variables>(GET_ASSET, {
  79. id: createdAssetId,
  80. });
  81. expect(asset?.id).toEqual(createdAssetId);
  82. });
  83. it('Asset is not in channel2', async () => {
  84. await adminClient.setChannelToken(SECOND_CHANNEL_TOKEN);
  85. const { asset } = await adminClient.query<GetAsset.Query, GetAsset.Variables>(GET_ASSET, {
  86. id: createdAssetId,
  87. });
  88. expect(asset).toBe(null);
  89. });
  90. it('Add asset to channel2', async () => {
  91. await adminClient.setChannelToken(E2E_DEFAULT_CHANNEL_TOKEN);
  92. const { assignAssetsToChannel: assets } = await adminClient.query<
  93. AssignAssetsToChannel.Mutation,
  94. AssignAssetsToChannel.Variables
  95. >(ASSIGN_ASSET_TO_CHANNEL, {
  96. input: {
  97. assetIds: [createdAssetId],
  98. channelId: channel2Id,
  99. },
  100. });
  101. expect(assets[0].id).toBe(createdAssetId);
  102. });
  103. it('Get asset from channel2', async () => {
  104. await adminClient.setChannelToken(SECOND_CHANNEL_TOKEN);
  105. const { asset } = await adminClient.query<GetAsset.Query, GetAsset.Variables>(GET_ASSET, {
  106. id: createdAssetId,
  107. });
  108. expect(asset?.id).toBe(createdAssetId);
  109. });
  110. it('Delete asset from channel2', async () => {
  111. const { deleteAsset } = await adminClient.query<DeleteAsset.Mutation, DeleteAsset.Variables>(
  112. DELETE_ASSET,
  113. {
  114. input: {
  115. assetId: createdAssetId,
  116. },
  117. },
  118. );
  119. expect(deleteAsset.result).toBe(DeletionResult.DELETED);
  120. });
  121. it('Asset is available in default channel', async () => {
  122. await adminClient.setChannelToken(E2E_DEFAULT_CHANNEL_TOKEN);
  123. const { asset } = await adminClient.query<GetAsset.Query, GetAsset.Variables>(GET_ASSET, {
  124. id: createdAssetId,
  125. });
  126. expect(asset?.id).toEqual(createdAssetId);
  127. });
  128. it('Add asset to channel2', async () => {
  129. await adminClient.setChannelToken(E2E_DEFAULT_CHANNEL_TOKEN);
  130. const { assignAssetsToChannel: assets } = await adminClient.query<
  131. AssignAssetsToChannel.Mutation,
  132. AssignAssetsToChannel.Variables
  133. >(ASSIGN_ASSET_TO_CHANNEL, {
  134. input: {
  135. assetIds: [createdAssetId],
  136. channelId: channel2Id,
  137. },
  138. });
  139. expect(assets[0].id).toBe(createdAssetId);
  140. });
  141. it(
  142. 'Delete asset from all channels with insufficient permission',
  143. assertThrowsWithMessage(async () => {
  144. await adminClient.asAnonymousUser();
  145. const { deleteAsset } = await adminClient.query<DeleteAsset.Mutation, DeleteAsset.Variables>(
  146. DELETE_ASSET,
  147. {
  148. input: {
  149. assetId: createdAssetId,
  150. deleteFromAllChannels: true,
  151. },
  152. },
  153. );
  154. }, `You are not currently authorized to perform this action`),
  155. );
  156. it('Delete asset from all channels as superadmin', async () => {
  157. await adminClient.asSuperAdmin();
  158. await adminClient.setChannelToken(SECOND_CHANNEL_TOKEN);
  159. const { deleteAsset } = await adminClient.query<DeleteAsset.Mutation, DeleteAsset.Variables>(
  160. DELETE_ASSET,
  161. {
  162. input: {
  163. assetId: createdAssetId,
  164. deleteFromAllChannels: true,
  165. },
  166. },
  167. );
  168. expect(deleteAsset.result).toEqual(DeletionResult.DELETED);
  169. });
  170. it('Asset is also deleted in default channel', async () => {
  171. await adminClient.setChannelToken(E2E_DEFAULT_CHANNEL_TOKEN);
  172. const { asset } = await adminClient.query<GetAsset.Query, GetAsset.Variables>(GET_ASSET, {
  173. id: createdAssetId,
  174. });
  175. expect(asset?.id).toBeUndefined();
  176. });
  177. });
  178. describe('Product related assets', () => {
  179. it('Featured asset is available in default channel', async () => {
  180. await adminClient.setChannelToken(E2E_DEFAULT_CHANNEL_TOKEN);
  181. const { product } = await adminClient.query<
  182. GetProductWithVariants.Query,
  183. GetProductWithVariants.Variables
  184. >(GET_PRODUCT_WITH_VARIANTS, {
  185. id: 'T_1',
  186. });
  187. featuredAssetId = product!.featuredAsset!.id;
  188. expect(featuredAssetId).toBeDefined();
  189. await adminClient.setChannelToken(E2E_DEFAULT_CHANNEL_TOKEN);
  190. const { asset } = await adminClient.query<GetAsset.Query, GetAsset.Variables>(GET_ASSET, {
  191. id: featuredAssetId,
  192. });
  193. expect(asset?.id).toEqual(featuredAssetId);
  194. });
  195. it('Featured asset is not available in channel2', async () => {
  196. await adminClient.setChannelToken(SECOND_CHANNEL_TOKEN);
  197. const { asset } = await adminClient.query<GetAsset.Query, GetAsset.Variables>(GET_ASSET, {
  198. id: featuredAssetId,
  199. });
  200. expect(asset?.id).toBeUndefined();
  201. });
  202. it('Add Product to channel2', async () => {
  203. await adminClient.setChannelToken(E2E_DEFAULT_CHANNEL_TOKEN);
  204. const { assignProductsToChannel } = await adminClient.query<
  205. AssignProductsToChannel.Mutation,
  206. AssignProductsToChannel.Variables
  207. >(ASSIGN_PRODUCT_TO_CHANNEL, {
  208. input: {
  209. channelId: channel2Id,
  210. productIds: ['T_1'],
  211. },
  212. });
  213. expect(assignProductsToChannel[0].id).toEqual('T_1');
  214. expect(assignProductsToChannel[0].channels.map(c => c.id)).toContain(channel2Id);
  215. });
  216. it('Get featured asset from channel2', async () => {
  217. await adminClient.setChannelToken(SECOND_CHANNEL_TOKEN);
  218. const { asset } = await adminClient.query<GetAsset.Query, GetAsset.Variables>(GET_ASSET, {
  219. id: featuredAssetId,
  220. });
  221. expect(asset?.id).toEqual(featuredAssetId);
  222. });
  223. it('Add Product 2 to channel2', async () => {
  224. await adminClient.setChannelToken(E2E_DEFAULT_CHANNEL_TOKEN);
  225. const { assignProductsToChannel } = await adminClient.query<
  226. AssignProductsToChannel.Mutation,
  227. AssignProductsToChannel.Variables
  228. >(ASSIGN_PRODUCT_TO_CHANNEL, {
  229. input: {
  230. channelId: channel2Id,
  231. productIds: ['T_2'],
  232. },
  233. });
  234. expect(assignProductsToChannel[0].id).toEqual('T_2');
  235. expect(assignProductsToChannel[0].channels.map(c => c.id)).toContain(channel2Id);
  236. });
  237. it('Add asset A to Product 2 in default channel', async () => {
  238. await adminClient.setChannelToken(E2E_DEFAULT_CHANNEL_TOKEN);
  239. const { updateProduct } = await adminClient.query<UpdateProduct.Mutation, UpdateProduct.Variables>(
  240. UPDATE_PRODUCT,
  241. {
  242. input: {
  243. id: 'T_2',
  244. assetIds: ['T_3'],
  245. },
  246. },
  247. );
  248. expect(updateProduct.assets.map(a => a.id)).toContain('T_3');
  249. });
  250. it('Channel2 does not have asset A', async () => {
  251. await adminClient.setChannelToken(SECOND_CHANNEL_TOKEN);
  252. const { product } = await adminClient.query<
  253. GetProductWithVariants.Query,
  254. GetProductWithVariants.Variables
  255. >(GET_PRODUCT_WITH_VARIANTS, {
  256. id: 'T_2',
  257. });
  258. expect(product!.assets.find(a => a.id === 'T_3')).toBeUndefined();
  259. });
  260. });
  261. export const ASSIGN_ASSET_TO_CHANNEL = gql`
  262. mutation assignAssetsToChannel($input: AssignAssetsToChannelInput!) {
  263. assignAssetsToChannel(input: $input) {
  264. ...Asset
  265. }
  266. }
  267. ${ASSET_FRAGMENT}
  268. `;