mirror of
				https://github.com/strapi/strapi.git
				synced 2025-10-31 01:47:13 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			443 lines
		
	
	
		
			13 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			443 lines
		
	
	
		
			13 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| let jwt;
 | |
| let userId;
 | |
| const animDelay = Cypress.config('animDelay');
 | |
| const frontEndUrl = Cypress.config('baseUrl');
 | |
| const frontLoadingDelay = Cypress.config('frontLoadingDelay');
 | |
| const backendUrl = Cypress.config('backendUrl');
 | |
| const pluginUrl = `${frontEndUrl}/admin/plugins/content-manager`;
 | |
| const getCreateRedirectUrl = (model, sort = '_id') => {
 | |
|   return `${frontEndUrl}/admin/plugins/content-manager/${model}/create?redirectUrl=/plugins/content-manager/${model}?_limit=10&_page=1&_sort=${sort}&source=content-manager`;
 | |
| };
 | |
| const getRequest = (model, sort = '_id') => {
 | |
|   return `${backendUrl}/content-manager/explorer/${model}?_limit=10&_start=0&_sort=${sort}:ASC&source=content-manager`;
 | |
| };
 | |
| 
 | |
| describe('Testing Content Manager createPages', function() {
 | |
|   before(() => {
 | |
|     cy.login()
 | |
|       .then(data => {
 | |
|         jwt = data.jwt;
 | |
| 
 | |
|         return cy
 | |
|           .createCTMApis(data.jwt)
 | |
|           .then(() => jwt);
 | |
|       })
 | |
|       .wait(1000);
 | |
| 
 | |
|     Cypress.Commands.add('ctmTagLink', () => {
 | |
|       return cy.get('a[href="/admin/plugins/content-manager/tag?source=content-manager"]');
 | |
|     });
 | |
|     Cypress.Commands.add('ctmProductLink', () => {
 | |
|         return cy.get('a[href="/admin/plugins/content-manager/product?source=content-manager"]');
 | |
|     });
 | |
|     Cypress.Commands.add('ctmCategoryLink', () => {
 | |
|       return cy.get('a[href="/admin/plugins/content-manager/category?source=content-manager"]');
 | |
|     });
 | |
|     Cypress.Commands.add('ctmAddButton', () => {
 | |
|       return cy.get('button#addEntry');
 | |
|     });
 | |
|     Cypress.Commands.add('inputError', (name) => {
 | |
|       return cy.get(`#errorOf${name} > span`);
 | |
|     });
 | |
|     Cypress.Commands.add('getListTagsOrderedByName', () => {
 | |
|       return cy.ctmTagLink()
 | |
|         .click()
 | |
|         .get('tr > th:nth-child(3) > span')
 | |
|         .click();
 | |
|     });
 | |
|     Cypress.Commands.add('fillProductForm', (product) => {
 | |
|       Object.keys(product)
 | |
|         .forEach(key => {
 | |
|           if (key === 'description') {
 | |
|             cy.get(`textarea[name="${key}"]`)
 | |
|               .type(product[key]);
 | |
|           } else {
 | |
|             cy.get(`input[name="${key}"]`)
 | |
|               .type(product[key]);
 | |
|           }
 | |
|         })
 | |
|     });
 | |
|     Cypress.Commands.add('getProduct', (index) => {
 | |
|       return cy
 | |
|         .ctmProductLink()
 | |
|         .click()
 | |
|         .wait(1000)
 | |
|         .get(`tbody > tr:nth-child(${index})`)
 | |
|         .click()
 | |
|         .wait(1000)
 | |
|         .window()
 | |
|         .its('__store__')
 | |
|         .its('content-manager')
 | |
|     });
 | |
|   });
 | |
| 
 | |
|   after(() => {
 | |
|     cy.deleteApi('tag', jwt)
 | |
|       .deleteApi('category', jwt)
 | |
|       .deleteApi('product', jwt)
 | |
|       .wait(11000);
 | |
|   });
 | |
| 
 | |
|   context('Creating data with no relation', () => {
 | |
|     beforeEach(() => {
 | |
|       cy.server();
 | |
|       cy.route(`${backendUrl}/content-manager/models`).as('initContentManager');
 | |
|       cy.login()
 | |
|         .then(data => {
 | |
|           jwt = data.jwt;
 | |
|           userId = data.user._id || data.user.id;
 | |
|         })
 | |
|         .visit('/admin')
 | |
|         .wait(frontLoadingDelay)
 | |
|         .wait('@initContentManager');
 | |
|     });
 | |
| 
 | |
|     after(() => {
 | |
|       cy.deleteAllModelData('tag', jwt)
 | |
|         .deleteAllModelData('category', jwt)
 | |
|         .deleteAllModelData('product', jwt);
 | |
|     });
 | |
| 
 | |
|     it('Should create a tag with no relation', () => {
 | |
|       cy.server();
 | |
|       cy.route(getRequest('tag')).as('getTags');
 | |
|       cy.ctmTagLink()
 | |
|         .click()
 | |
|         .ctmAddButton()
 | |
|         .click();
 | |
|       const tagsToCreate = ['tag1',  'tag2', 'tag3', 'superTag', 'badTag', 'I\'m running out of idea tag'];
 | |
|       // Check redirect url
 | |
|       cy.url()
 | |
|         .should('equal', getCreateRedirectUrl('tag'));
 | |
|       
 | |
|       // Try to save empty data
 | |
|       cy.submitForm()
 | |
|         .get('input#name')
 | |
|         .invoke('attr', 'class')
 | |
|         .should('include', 'form-control is-invalid');
 | |
|       
 | |
|       tagsToCreate.forEach((tagName,  index) => {
 | |
|         cy.get('input#name')
 | |
|           .type(tagName)
 | |
|           .submitForm()
 | |
|           .wait('@getTags')
 | |
|           .get('tbody')
 | |
|           .children()
 | |
|           .should('have.length', index + 1);
 | |
|         
 | |
|         if (index < tagsToCreate.length -1) {
 | |
|           cy.ctmAddButton()
 | |
|             .click();
 | |
|         }
 | |
|       });
 | |
|     });
 | |
| 
 | |
|     it('Should create a category with no relation', () => {
 | |
|       cy.server();
 | |
|       cy.route(getRequest('category', 'name')).as('getCategories');
 | |
|       cy.ctmCategoryLink()
 | |
|         .click()
 | |
|         .get('tr > th:nth-child(3) > span')
 | |
|         .click()
 | |
|         .ctmAddButton()
 | |
|         .click();
 | |
|       const catsToCreate = ['drinks',  'food', 'junk food', 'french food', 'good french food', 'greasy', 'you don\'t want to eat that'];
 | |
|       // Check redirect url
 | |
|       cy.url()
 | |
|         .should('equal', getCreateRedirectUrl('category', 'name'));
 | |
|       
 | |
|       catsToCreate.forEach((catName, index) => {
 | |
|         cy.get('input#name')
 | |
|           .type(catName)
 | |
|           .submitForm()
 | |
|           .wait('@getCategories')
 | |
|           .get('tbody')
 | |
|           .children()
 | |
|           .should('have.length', index + 1);
 | |
|         
 | |
|         if (index < catsToCreate.length -1) {
 | |
|           cy.ctmAddButton()
 | |
|           .click();
 | |
|         }
 | |
|       });
 | |
|     });
 | |
| 
 | |
|     it('Should display an error for unique fields for categories', () => {
 | |
|       cy.ctmCategoryLink()
 | |
|         .click()
 | |
|         .ctmAddButton()
 | |
|         .click()
 | |
|         .get('input#name')
 | |
|         .type('drinks')
 | |
|         .submitForm()
 | |
|         .get('input#name')
 | |
|         .invoke('attr', 'class')
 | |
|         .should('includes', 'form-control is-invalid')
 | |
|         .get('input#name')
 | |
|         .inputError('name')
 | |
|         .should('have.text', 'This name is already taken ');
 | |
|     });
 | |
| 
 | |
|     it('Should delete all data using the UI', () => {
 | |
|       cy.server();
 | |
|       cy.route(getRequest('tag')).as('getTags');
 | |
|       cy.route(getRequest('category', 'name')).as('getCategories');
 | |
| 
 | |
|       cy.ctmTagLink()
 | |
|         .click()
 | |
|         .wait('@getTags')
 | |
|         .wait(1000)
 | |
|         .get('thead > tr > th:first-child')
 | |
|         .click()
 | |
|         .get('span#deleteAllData')
 | |
|         .click()
 | |
|         .get('button#ctaConfirm')
 | |
|         .click()
 | |
|         .wait(2000)
 | |
|         .window()
 | |
|         .its('__store__')
 | |
|         .its('content-manager')
 | |
|         .then(pluginStore => {
 | |
|           const records = pluginStore
 | |
|             .getState()
 | |
|             .getIn(['listPage', 'records', 'tag'])
 | |
|             .toJS();
 | |
| 
 | |
|           expect(records).to.have.length(0);
 | |
|         });
 | |
|     });
 | |
|   });
 | |
| 
 | |
|   context('Creating and updating data with relation', () => {
 | |
|     before(() => {
 | |
|       cy.server();
 | |
|       cy.route(`${backendUrl}/content-manager/models`).as('initContentManager');
 | |
|       cy.login()
 | |
|         .then(data => {
 | |
|           jwt = data.jwt;
 | |
|           userId = data.user._id || data.user.id;
 | |
| 
 | |
|           return data.jwt;
 | |
|         })
 | |
|         .then(jwt => {
 | |
|           return cy.seedData('tag', jwt)
 | |
|             .then(() => jwt);
 | |
| 
 | |
|         })
 | |
|         .then(jwt => {
 | |
|           return cy.seedData('category', jwt);
 | |
|         });
 | |
|     });
 | |
| 
 | |
|     beforeEach(() => {
 | |
|       cy.server();
 | |
|       cy.route(`${backendUrl}/content-manager/models`).as('initContentManager');
 | |
|       cy.login()
 | |
|         .then(data => {
 | |
|           jwt = data.jwt;
 | |
|           userId = data.user._id || data.user.id;
 | |
| 
 | |
|           return data.jwt;
 | |
|         })
 | |
|         .visit('/admin')
 | |
|         .wait(frontLoadingDelay)
 | |
|         .wait('@initContentManager');
 | |
|     })
 | |
| 
 | |
|     it('Should create a product and link several tags and 1 category', () => {
 | |
|       cy.server();
 | |
|       cy.route(`${backendUrl}/content-manager/explorer/tag?_limit=10&_start=0&_sort=name:ASC&source=content-manager`).as('getTags');
 | |
|       cy.ctmProductLink()
 | |
|         .click()
 | |
|         .ctmAddButton()
 | |
|         .click();
 | |
|       
 | |
|       // Test default value
 | |
|       cy.get('button#__OFF__bool')
 | |
|         .invoke('attr', 'class')
 | |
|         .should('includes', 'gradientOff')
 | |
|         .get('button#__ON__bool1')
 | |
|         .invoke('attr', 'class')
 | |
|         .should('includes', 'gradientOn');
 | |
| 
 | |
|       // Create a product
 | |
|       const product =  {
 | |
|         name: 'product1',
 | |
|         description: 'This is a super description',
 | |
|         price: 1337,
 | |
|         email: 'hi@strapi.io',
 | |
|       };
 | |
| 
 | |
|       Object.keys(product)
 | |
|         .forEach(key => {
 | |
|           if (key === 'description') {
 | |
|             cy.get(`textarea[name="${key}"]`)
 | |
|               .type(product[key]);
 | |
|           } else {
 | |
|             cy.get(`input[name="${key}"]`)
 | |
|               .type(product[key]);
 | |
|           }
 | |
|         });
 | |
| 
 | |
|       cy.get('button#__ON__bool')
 | |
|         .click()
 | |
|         .get('button#__OFF__bool1')
 | |
|         .click();
 | |
| 
 | |
|       cy.get('input#tags')
 | |
|         .type('special t', { force: true })
 | |
|         .type('{enter}', { force: true })
 | |
|         .type('ta', { force: true })
 | |
|         .type('{enter}', { force: true })
 | |
|         .get('ul#sortableListOftags')
 | |
|         .children('li')
 | |
|         .should((children) => {
 | |
|           expect(children[0].innerText.trim()).to.equal('special tag');
 | |
|           expect(children[1].innerText.trim()).to.equal('tag1');
 | |
|         })
 | |
|         .get('input#category')
 | |
|         .type('french food', { force: true })
 | |
|         .type('{enter}')
 | |
|         .invoke('attr', 'value')
 | |
|         .should('equal', 'french food')
 | |
|         .submitForm();
 | |
| 
 | |
|       cy.getListTagsOrderedByName()
 | |
|         .wait('@getTags')
 | |
|         .wait(1000)
 | |
|         .get('tbody > tr:first-child')
 | |
|         .click()
 | |
|         .get('ul#sortableListOfproducts')
 | |
|         .children()
 | |
|         .should((children) => {
 | |
|           expect(children).to.have.length(1);
 | |
|           expect(children[0].innerText.trim()).to.equal('product1');
 | |
|         });
 | |
|   
 | |
|       cy.getListTagsOrderedByName()
 | |
|         .wait('@getTags')
 | |
|         .wait(2000)
 | |
|         .get('tbody > tr:nth-child(2)')
 | |
|         .click()
 | |
|         .get('ul#sortableListOfproducts')
 | |
|         .children()
 | |
|         .should((children) => {
 | |
|           expect(children).to.have.length(1);
 | |
|           expect(children[0].innerText.trim()).to.equal('product1');
 | |
|         });
 | |
|     }); 
 | |
| 
 | |
|     it('Should delete a product in tag1', () => {
 | |
|       cy.getListTagsOrderedByName()
 | |
|         .wait(frontLoadingDelay)
 | |
|         .get('tbody > tr:nth-child(2)')
 | |
|         .click()
 | |
|         .wait(1000)
 | |
|         .get('ul#sortableListOfproducts > li:nth-child(1) > div:nth-child(2)')
 | |
|         .click()
 | |
|         .submitForm()
 | |
|         .ctmProductLink()
 | |
|         .click()
 | |
|         .wait(1000)
 | |
|         .get('tbody > tr:nth-child(1)')
 | |
|         .click()
 | |
|         .wait(frontLoadingDelay)
 | |
|         .get('ul#sortableListOftags')
 | |
|         .children()
 | |
|         .should((children) => {
 | |
|           expect(children).to.have.length(1);
 | |
|           expect(children[0].innerText.trim()).to.equal('special tag');
 | |
|         });
 | |
|     });
 | |
| 
 | |
|     it('Should add several products to category french food', () => {
 | |
|       cy.server();
 | |
|       cy.route(`${backendUrl}/content-manager/explorer/category?_limit=10&_start=0&_sort=_id:ASC&source=content-manager`).as('getCategories');
 | |
|       cy.route(`${backendUrl}/content-manager/explorer/product?_limit=10&_start=0&_sort=_id:ASC&source=content-manager`).as('getProducts');
 | |
|       const product = {
 | |
|         name: 'MacBook',
 | |
|         description: 'A laptop',
 | |
|         price: 2000,
 | |
|         email: 'john@strapi.io',
 | |
|       };
 | |
|       const product2 = {
 | |
|         name: 'Dell',
 | |
|         description: 'Not a mac',
 | |
|         price: 4,
 | |
|         email: 'bob@strapi.io',
 | |
|       };
 | |
| 
 | |
|       cy.ctmProductLink()
 | |
|         .click()
 | |
|         .ctmAddButton()
 | |
|         .click();
 | |
| 
 | |
|       cy.fillProductForm(product)
 | |
|         .submitForm()
 | |
|         .ctmAddButton()
 | |
|         .click()
 | |
|         .fillProductForm(product2)
 | |
|         .submitForm();
 | |
| 
 | |
|       cy.ctmCategoryLink()
 | |
|         .click()
 | |
|         .wait('@getCategories')
 | |
|         .wait(1000)
 | |
|         .get('tbody > tr:nth-child(5)')
 | |
|         .click()
 | |
|         .get('ul#sortableListOfproducts').as('relations')
 | |
|         .children()
 | |
|         .should(children => {
 | |
|           expect(children).to.have.length(1);
 | |
|           expect(children[0].innerText.trim()).to.equal('product1');
 | |
|         })
 | |
|         .get('ul#sortableListOfproducts > li:nth-child(1) > div:nth-child(2)')
 | |
|         .click()
 | |
|         .get('input#products')
 | |
|         .type('mac', { force: true })
 | |
|         .type('{enter}', { force: true })
 | |
|         .type('dell', { force: true })
 | |
|         .type('{enter}', { force: true })
 | |
|         .get('@relations')
 | |
|         .children()
 | |
|         .should(children => {
 | |
|           expect(children).to.have.length(2);
 | |
|           expect(children[0].innerText.trim()).to.equal('MacBook');
 | |
|           expect(children[1].innerText.trim()).to.equal('Dell');
 | |
|         })
 | |
|         .submitForm();
 | |
| 
 | |
|       cy.getProduct(1)
 | |
|         .then(pluginStore => {
 | |
|           const category = pluginStore
 | |
|             .getState()
 | |
|             .getIn(['editPage', 'record', 'category'])
 | |
|           
 | |
|             expect(category).to.equal(null);
 | |
|         });
 | |
| 
 | |
|       cy.getProduct(2)
 | |
|         .then(pluginStore => {
 | |
|           const category = pluginStore
 | |
|             .getState()
 | |
|             .getIn(['editPage', 'record', 'category', 'name'])
 | |
|           
 | |
|             expect(category).to.equal('french food');
 | |
|         })
 | |
|         .getProduct(3)
 | |
|         .then(pluginStore => {
 | |
|           const category = pluginStore
 | |
|             .getState()
 | |
|             .getIn(['editPage', 'record', 'category', 'name'])
 | |
|           
 | |
|             expect(category).to.equal('french food');
 | |
|         });
 | |
|     });
 | |
| 
 | |
|     after(() => {
 | |
|       cy.deleteAllModelData('tag', jwt)
 | |
|         .deleteAllModelData('category', jwt)
 | |
|         .deleteAllModelData('product', jwt);
 | |
|     });
 | |
|   });
 | |
| }); | 
