0
0
mirror of https://github.com/naturalcrit/homebrewery.git synced 2026-01-08 07:32:40 +00:00

Merge branch 'master' into pr/2649

This commit is contained in:
Trevor Buckner
2023-02-22 14:57:34 -05:00
23 changed files with 1033 additions and 895 deletions

2
.gitignore vendored
View File

@@ -12,3 +12,5 @@ todo.md
startDB.bat startDB.bat
startMViewer.bat startMViewer.bat
.vscode .vscode
coverage

View File

@@ -21,24 +21,29 @@ below.
First, install three programs that The Homebrewery requires to run and retrieve First, install three programs that The Homebrewery requires to run and retrieve
updates: updates:
1. install [node](https://nodejs.org/en/) 1. install [node](https://nodejs.org/en/), version v16 or higher.
1. install [mongodb](https://www.mongodb.com/try/download/community) (Community version) 1. install [mongodb](https://www.mongodb.com/try/download/community) (Community version)
For the easiest installation, follow these steps: For the easiest installation, follow these steps:
1. In the installer, uncheck the option to run as a service. 1. In the installer, uncheck the option to run as a service.
1. You can install MongoDB Compass if you want a GUI to view your database documents. 1. You can install MongoDB Compass if you want a GUI to view your database documents.
1. If you install any version over 6.0, you will have to install [MongoDB Shell](https://www.mongodb.com/try/download/shell).
1. Go to the C:\ drive and create a folder called "data". 1. Go to the C:\ drive and create a folder called "data".
1. Inside the "data" folder, create a new folder called "db". 1. Inside the "data" folder, create a new folder called "db".
1. Open a command prompt or other terminal and navigate to your MongoDB install folder (C:\Program Files\Mongo\Server\4.4\bin). 1. Open a command prompt or other terminal and navigate to your MongoDB install folder (C:\Program Files\Mongo\Server\6.0\bin).
1. In the command prompt, run "mongod", which will start up your local database server. 1. In the command prompt, run "mongod", which will start up your local database server.
1. While MongoD is running, open a second command prompt and navigate to the MongoDB install folder. 1. While MongoD is running, open a second command prompt and navigate to the MongoDB install folder.
1. In the second command prompt, run "mongo", which allows you to edit the database.
1. Type `use homebrewery` to create The Homebrewery database. You should see `switched to db homebrewery`.
1. Type `db.brews.insert({"title":"test"})` to create a blank document. You should see `WriteResult({ "nInserted" : 1 })`.
1. Search in Windows for "Advanced system settings" and open it. 1. Search in Windows for "Advanced system settings" and open it.
1. Click "Environment variables", find the "path" variable, and double-click to open it. 1. Click "Environment variables", find the "path" variable, and double-click to open it.
1. Click "New" and paste in the path to the MongoDB "bin" folder. 1. Click "New" and paste in the path to the MongoDB "bin" folder.
1. Click "OK" three times to close all the windows. 1. Click "OK" three times to close all the windows.
1. In the second command prompt, run "mongo", which allows you to edit the database.
1. Type `use homebrewery` to create The Homebrewery database. You should see `switched to db homebrewery`.
1. Type `db.brews.insertOne({"title":"test"})` to create a blank document. You should see `{
acknowledged: true,
insertedId: ObjectId("63c2fce9e5ac5a94fe2410cf")
}`
1. install [git](https://git-scm.com/downloads) (select the option that allows Git to run from the command prompt). 1. install [git](https://git-scm.com/downloads) (select the option that allows Git to run from the command prompt).
Checkout the repo ([documentation][github-clone-repo-docs-url]): Checkout the repo ([documentation][github-clone-repo-docs-url]):
@@ -51,11 +56,19 @@ git clone https://github.com/naturalcrit/homebrewery.git
Second, you will need to add the environment variable `NODE_ENV=local` to allow Second, you will need to add the environment variable `NODE_ENV=local` to allow
the project to run locally. the project to run locally.
You can set this temporarily in your shell of choice: You can set this **temporarily** (until you close the terminal) in your shell of choice with admin privileges:
* Windows Powershell: `$env:NODE_ENV="local"` * Windows Powershell: `$env:NODE_ENV="local"`
* Windows CMD: `set NODE_ENV=local` * Windows CMD: `set NODE_ENV=local`
* Linux / macOS: `export NODE_ENV=local` * Linux / macOS: `export NODE_ENV=local`
If you want to add this variable **permanently** the steps are as follows:
1. Search in Windows for "Advanced system settings" and open it.
1. Click "Environment variables".
1. In System Variables, click "New"
1. Click "New" and write `NODE_ENV` as a name and `local` as the value.
1. Click "OK" three times to close all the windows.
This can be undone at any time if needed.
Third, you will need to install the Node dependencies, compile the app, and run Third, you will need to install the Node dependencies, compile the app, and run
it using the two commands: it using the two commands:
@@ -65,6 +78,13 @@ it using the two commands:
You should now be able to go to [http://localhost:8000](http://localhost:8000) You should now be able to go to [http://localhost:8000](http://localhost:8000)
in your browser and use The Homebrewery offline. in your browser and use The Homebrewery offline.
If you had any issue at all, here are some links that may be useful:
- [Course](https://learn.mongodb.com/courses/m103-basic-cluster-administration) on cluster administration, useful for beginners
- [Mongo community forums](https://www.mongodb.com/community/forums/)
- Useful Stack Overflow links for your most probable errors: [1](https://stackoverflow.com/questions/44962540/mongod-and-mongo-commands-not-working-on-windows-10), [2](https://stackoverflow.com/questions/15053893/mongo-command-not-recognized-when-trying-to-connect-to-a-mongodb-server/41507803#41507803), [3](https://stackoverflow.com/questions/51224959/mongo-is-not-recognized-as-an-internal-or-external-command-operable-program-o)
If you still have problems, post in [Our Subreddit](https://www.reddit.com/r/homebrewery/) and we will help you.
### Running the application via Docker ### Running the application via Docker
Please see the docs here: [README.DOCKER.md](./README.DOCKER.md) Please see the docs here: [README.DOCKER.md](./README.DOCKER.md)

View File

@@ -61,6 +61,16 @@ pre {
## changelog ## changelog
For a full record of development, visit our [Github Page](https://github.com/naturalcrit/homebrewery). For a full record of development, visit our [Github Page](https://github.com/naturalcrit/homebrewery).
### Saturday 18/02/2023 - v3.6.1
{{taskList
##### G-Ambatte
* [x] Fix users not being removed from Authors list correctly
Fixes issues [#2674](https://github.com/naturalcrit/homebrewery/issues/2674)
}}
### Friday 23/01/2023 - v3.6.0 ### Friday 23/01/2023 - v3.6.0
{{taskList {{taskList
##### calculuschild ##### calculuschild

View File

@@ -134,7 +134,8 @@ const BrewRenderer = createClass({
renderStyle : function() { renderStyle : function() {
if(!this.props.style) return; if(!this.props.style) return;
return <div style={{ display: 'none' }} dangerouslySetInnerHTML={{ __html: `<style> ${this.props.style} </style>` }} />; //return <div style={{ display: 'none' }} dangerouslySetInnerHTML={{ __html: `<style>@layer styleTab {\n${this.props.style}\n} </style>` }} />;
return <div style={{ display: 'none' }} dangerouslySetInnerHTML={{ __html: `<style>\n${this.props.style}\n</style>` }} />;
}, },
renderPage : function(pageText, index){ renderPage : function(pageText, index){

View File

@@ -37,7 +37,7 @@ const MetadataEditor = createClass({
renderer : 'legacy', renderer : 'legacy',
theme : '5ePHB' theme : '5ePHB'
}, },
onChange : ()=>{}, onChange : ()=>{},
reportError : ()=>{} reportError : ()=>{}
}; };
}, },

View File

@@ -163,15 +163,22 @@ const SnippetGroup = createClass({
onSnippetClick : function(){}, onSnippetClick : function(){},
}; };
}, },
handleSnippetClick : function(snippet){ handleSnippetClick : function(e, snippet){
e.stopPropagation();
this.props.onSnippetClick(execute(snippet.gen, this.props.brew)); this.props.onSnippetClick(execute(snippet.gen, this.props.brew));
}, },
renderSnippets : function(){ renderSnippets : function(snippets){
return _.map(this.props.snippets, (snippet)=>{ return _.map(snippets, (snippet)=>{
return <div className='snippet' key={snippet.name} onClick={()=>this.handleSnippetClick(snippet)}> return <div className='snippet' key={snippet.name} onClick={(e)=>this.handleSnippetClick(e, snippet)}>
<i className={snippet.icon} /> <i className={snippet.icon} />
{snippet.name} {snippet.name}
{snippet.subsnippets && <>
<i className='fas fa-caret-right'></i>
<div className='dropdown side'>
{this.renderSnippets(snippet.subsnippets)}
</div></>}
</div>; </div>;
}); });
}, },
@@ -182,7 +189,7 @@ const SnippetGroup = createClass({
<span className='groupName'>{this.props.groupName}</span> <span className='groupName'>{this.props.groupName}</span>
</div> </div>
<div className='dropdown'> <div className='dropdown'>
{this.renderSnippets()} {this.renderSnippets(this.props.snippets)}
</div> </div>
</div>; </div>;
}, },

View File

@@ -1,4 +1,4 @@
@import (less) './client/icons/customIcons.less';
.snippetBar{ .snippetBar{
@menuHeight : 25px; @menuHeight : 25px;
position : relative; position : relative;
@@ -83,7 +83,7 @@
.snippetGroup{ .snippetGroup{
border-right : 1px solid black; border-right : 1px solid black;
&:hover{ &:hover{
.dropdown{ &>.dropdown{
visibility : visible; visibility : visible;
} }
} }
@@ -97,15 +97,30 @@
background-color : #ddd; background-color : #ddd;
.snippet{ .snippet{
.animate(background-color); .animate(background-color);
width : max-content;
padding : 5px; padding : 5px;
cursor : pointer; cursor : pointer;
font-size : 10px; font-size : 10px;
i{ i{
margin-right : 8px; margin-right : 8px;
font-size : 1.2em; font-size : 1.2em;
height : 1.2em;
&~i{
margin-right: 0;
margin-left: 8px;
}
} }
&:hover{ &:hover{
background-color : #999; background-color : #999;
&>.dropdown{
visibility : visible;
&.side {
left: 100%;
top: 0%;
margin-left:0;
box-shadow: -1px 1px 2px 0px #999;
}
}
} }
} }
} }

View File

@@ -219,12 +219,13 @@ const ListPage = createClass({
render : function(){ render : function(){
return <div className='listPage sitePage'> return <div className='listPage sitePage'>
<style>@layer V3_5ePHB, bundle;</style>
<link href='/themes/V3/5ePHB/style.css' rel='stylesheet'/> <link href='/themes/V3/5ePHB/style.css' rel='stylesheet'/>
{this.props.navItems} {this.props.navItems}
{this.renderSortOptions()} {this.renderSortOptions()}
<div className='content V3'> <div className='content V3'>
<div className='phb page'> <div className='page'>
{this.renderBrewCollection(this.state.brewCollection)} {this.renderBrewCollection(this.state.brewCollection)}
</div> </div>
</div> </div>

View File

@@ -10,14 +10,14 @@
-moz-column-width : auto; -moz-column-width : auto;
-webkit-column-gap : auto; -webkit-column-gap : auto;
-moz-column-gap : auto; -moz-column-gap : auto;
height : auto;
min-height : 279.4mm;
margin : 20px auto;
} }
.listPage{ .listPage{
.content{ .content{
.phb{ .page{
.noColumns(); .noColumns() !important; //Needed to override PHB Theme since this is on a lower @layer
height : auto;
min-height : 279.4mm;
margin : 20px auto;
&::after{ &::after{
display : none; display : none;
} }

View File

@@ -60,7 +60,8 @@ const PrintPage = createClass({
renderStyle : function() { renderStyle : function() {
if(!this.state.brew.style) return; if(!this.state.brew.style) return;
return <div style={{ display: 'none' }} dangerouslySetInnerHTML={{ __html: `<style> ${this.state.brew.style} </style>` }} />; //return <div style={{ display: 'none' }} dangerouslySetInnerHTML={{ __html: `<style>@layer styleTab {\n${this.state.brew.style}\n} </style>` }} />;
return <div style={{ display: 'none' }} dangerouslySetInnerHTML={{ __html: `<style>\n${this.state.brew.style}\n</style>` }} />;
}, },
renderPages : function(){ renderPages : function(){

View File

@@ -0,0 +1,15 @@
.fac {
display : inline-block;
}
.position-top-left {
content: url('../icons/position-top-left.svg');
}
.position-top-right {
content: url('../icons/position-top-right.svg');
}
.position-bottom-left {
content: url('../icons/position-bottom-left.svg');
}
.position-bottom-right {
content: url('../icons/position-bottom-right.svg');
}

View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 495 495"><path fill-opacity=".995" d="M495 135.49V0H359.51v135.49M482.72 11.37v113.26H371.9V11.37zM135.49 315.245v-135.49H0v135.49m123.21-124.12v113.26H12.39v-113.26zm12.28-55.635V0H0v135.49M123.21 11.37v113.26H12.39V11.37zm192.035 124.12V0h-135.49v135.49m123.21-124.12v113.26h-110.82V11.37zm12.28 303.875v-135.49h-135.49v135.49m123.21-124.12v113.26h-110.82v-113.26zM495 315.245v-135.49H359.51v135.49m123.21-124.12v113.26H371.9v-113.26zM135.49 495V359.51H0V495Zm179.755 0V359.51h-135.49V495m123.21-124.12v113.26h-110.82V370.88zM495 495V359.51H359.51V495m123.21-124.12v113.26H371.9V370.88z"/></svg>

After

Width:  |  Height:  |  Size: 650 B

View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 495 495"><g fill-opacity=".995"><path d="M135.49 0H0v135.49h135.49M11.37 12.28h113.26V123.1H11.37zM315.245 359.51h-135.49V495h135.49m-124.12-123.21h113.26v110.82h-113.26zM135.49 359.51H0V495h135.49M11.37 371.79h113.26v110.82H11.37zM135.49 179.755H0v135.49h135.49M11.37 192.035h113.26v110.82H11.37zM315.245 179.755h-135.49v135.49h135.49m-124.12-123.21h113.26v110.82h-113.26zM315.245 0h-135.49v135.49h135.49M191.125 12.28h113.26V123.1h-113.26zM495 359.51H359.51V495H495ZM495 179.755H359.51v135.49H495m-124.12-123.21h113.26v110.82H370.88zM495 0H359.51v135.49H495M370.88 12.28h113.26V123.1H370.88z"/></g></svg>

After

Width:  |  Height:  |  Size: 659 B

View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 495 495"><path fill-opacity=".995" d="M359.51 495H495V359.51H359.51m124.12 123.21H370.37V371.9h113.26zM179.755 135.49h135.49V0h-135.49m124.12 123.21h-113.26V12.39h113.26zM359.51 135.49H495V0H359.51m124.12 123.21H370.37V12.39h113.26zM359.51 315.245H495v-135.49H359.51m124.12 123.21H370.37v-110.82h113.26zM179.755 315.245h135.49v-135.49h-135.49m124.12 123.21h-113.26v-110.82h113.26zM179.755 495h135.49V359.51h-135.49m124.12 123.21h-113.26V371.9h113.26zM0 135.49h135.49V0H0ZM0 315.245h135.49v-135.49H0m124.12 123.21H10.86v-110.82h113.26zM0 495h135.49V359.51H0m124.12 123.21H10.86V371.9h113.26z"/></svg>

After

Width:  |  Height:  |  Size: 652 B

View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 495 495"><g fill-opacity=".995"><path d="M0 359.51V495h135.49V359.51M12.28 483.63V370.37H123.1v113.26zM359.51 179.755v135.49H495v-135.49m-123.21 124.12v-113.26h110.82v113.26zM359.51 359.51V495H495V359.51M371.79 483.63V370.37h110.82v113.26zM179.755 359.51V495h135.49V359.51m-123.21 124.12V370.37h110.82v113.26zM179.755 179.755v135.49h135.49v-135.49m-123.21 124.12v-113.26h110.82v113.26zM0 179.755v135.49h135.49v-135.49M12.28 303.875v-113.26H123.1v113.26zM359.51 0v135.49H495V0ZM179.755 0v135.49h135.49V0m-123.21 124.12V10.86h110.82v113.26zM0 0v135.49h135.49V0M12.28 124.12V10.86H123.1v113.26z"/></g></svg>

After

Width:  |  Height:  |  Size: 657 B

1743
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@@ -1,7 +1,7 @@
{ {
"name": "homebrewery", "name": "homebrewery",
"description": "Create authentic looking D&D homebrews using only markdown", "description": "Create authentic looking D&D homebrews using only markdown",
"version": "3.6.0", "version": "3.6.1",
"engines": { "engines": {
"node": "16.11.x" "node": "16.11.x"
}, },
@@ -68,11 +68,11 @@
] ]
}, },
"dependencies": { "dependencies": {
"@babel/core": "^7.20.12", "@babel/core": "^7.21.0",
"@babel/plugin-transform-runtime": "^7.19.6", "@babel/plugin-transform-runtime": "^7.21.0",
"@babel/preset-env": "^7.19.4", "@babel/preset-env": "^7.19.4",
"@babel/preset-react": "^7.18.6", "@babel/preset-react": "^7.18.6",
"body-parser": "^1.20.1", "body-parser": "^1.20.2",
"classnames": "^2.3.2", "classnames": "^2.3.2",
"codemirror": "^5.65.6", "codemirror": "^5.65.6",
"cookie-parser": "^1.4.6", "cookie-parser": "^1.4.6",
@@ -82,7 +82,7 @@
"express-async-handler": "^1.2.0", "express-async-handler": "^1.2.0",
"express-static-gzip": "2.1.7", "express-static-gzip": "2.1.7",
"fs-extra": "11.1.0", "fs-extra": "11.1.0",
"googleapis": "110.0.0", "googleapis": "111.0.0",
"js-yaml": "^4.1.0", "js-yaml": "^4.1.0",
"jwt-simple": "^0.5.6", "jwt-simple": "^0.5.6",
"less": "^3.13.1", "less": "^3.13.1",
@@ -91,22 +91,22 @@
"marked-extended-tables": "^1.0.5", "marked-extended-tables": "^1.0.5",
"markedLegacy": "npm:marked@^0.3.19", "markedLegacy": "npm:marked@^0.3.19",
"moment": "^2.29.4", "moment": "^2.29.4",
"mongoose": "^6.9.0", "mongoose": "^6.9.2",
"nanoid": "3.3.4", "nanoid": "3.3.4",
"nconf": "^0.12.0", "nconf": "^0.12.0",
"npm": "^8.10.0", "npm": "^8.10.0",
"react": "^17.0.2", "react": "^17.0.2",
"react-dom": "^17.0.2", "react-dom": "^17.0.2",
"react-frame-component": "4.1.3", "react-frame-component": "4.1.3",
"react-router-dom": "6.8.0", "react-router-dom": "6.8.1",
"sanitize-filename": "1.6.3", "sanitize-filename": "1.6.3",
"superagent": "^6.1.0", "superagent": "^6.1.0",
"vitreum": "git+https://git@github.com/calculuschild/vitreum.git" "vitreum": "git+https://git@github.com/calculuschild/vitreum.git"
}, },
"devDependencies": { "devDependencies": {
"eslint": "^8.32.0", "eslint": "^8.34.0",
"eslint-plugin-react": "^7.32.1", "eslint-plugin-react": "^7.32.2",
"jest": "^29.4.1", "jest": "^29.4.3",
"supertest": "^6.3.3" "supertest": "^6.3.3"
} }
} }

View File

@@ -20,7 +20,8 @@ const transforms = {
}; };
const build = async ({ bundle, render, ssr })=>{ const build = async ({ bundle, render, ssr })=>{
const css = await lessTransform.generate({ paths: './shared' }); let css = await lessTransform.generate({ paths: './shared' });
css = `@layer bundle {\n${css}\n}`;
await fs.outputFile('./build/homebrew/bundle.css', css); await fs.outputFile('./build/homebrew/bundle.css', css);
await fs.outputFile('./build/homebrew/bundle.js', bundle); await fs.outputFile('./build/homebrew/bundle.js', bundle);
await fs.outputFile('./build/homebrew/ssr.js', ssr); await fs.outputFile('./build/homebrew/ssr.js', ssr);
@@ -96,6 +97,7 @@ fs.emptyDirSync('./build');
// Move assets // Move assets
await fs.copy('./themes/fonts', './build/fonts'); await fs.copy('./themes/fonts', './build/fonts');
await fs.copy('./themes/assets', './build/assets'); await fs.copy('./themes/assets', './build/assets');
await fs.copy('./client/icons', './build/icons');
//v==----------------------------- BUNDLE PACKAGES --------------------------------==v// //v==----------------------------- BUNDLE PACKAGES --------------------------------==v//

View File

@@ -294,8 +294,15 @@ app.get('/edit/:id', asyncHandler(getBrew('edit')), (req, res, next)=>{
app.get('/new/:id', asyncHandler(getBrew('share')), (req, res, next)=>{ app.get('/new/:id', asyncHandler(getBrew('share')), (req, res, next)=>{
sanitizeBrew(req.brew, 'share'); sanitizeBrew(req.brew, 'share');
splitTextStyleAndMetadata(req.brew); splitTextStyleAndMetadata(req.brew);
req.brew.views = 0; const brew = {
req.brew.title = `CLONE - ${req.brew.title}`; shareId : req.brew.shareId,
title : `CLONE - ${req.brew.title}`,
text : req.brew.text,
style : req.brew.style,
renderer : req.brew.renderer,
theme : req.brew.theme
};
req.brew = _.defaults(brew, DEFAULT_BREW);
req.ogMeta = { ...defaultMetaTags, req.ogMeta = { ...defaultMetaTags,
title : 'New', title : 'New',

View File

@@ -16,6 +16,7 @@ const DEFAULT_BREW = {
tags : [], tags : [],
systems : [], systems : [],
thumbnail : '', thumbnail : '',
views : 0,
published : false, published : false,
pageCount : 1, pageCount : 1,
gDrive : false, gDrive : false,

View File

@@ -317,8 +317,7 @@ If you believe you should have access to this brew, ask the file owner to invite
brew.textBin = zlib.deflateRawSync(brew.text); brew.textBin = zlib.deflateRawSync(brew.text);
brew.text = undefined; brew.text = undefined;
} }
brew.markModified('authors'); //Mongo will not properly update arrays without markModified()
// Otherwise, save the brew with updated author list
await brew.save() await brew.save()
.catch((err)=>{ .catch((err)=>{
throw { status: 500, message: err }; throw { status: 500, message: err };

View File

@@ -11,6 +11,7 @@ describe('Tests for api', ()=>{
let modelBrew; let modelBrew;
let saveFunc; let saveFunc;
let removeFunc; let removeFunc;
let markModifiedFunc;
let saved; let saved;
beforeEach(()=>{ beforeEach(()=>{
@@ -20,15 +21,18 @@ describe('Tests for api', ()=>{
return saved; return saved;
}); });
removeFunc = jest.fn(async function() {}); removeFunc = jest.fn(async function() {});
markModifiedFunc = jest.fn(()=>true);
modelBrew = (brew)=>({ modelBrew = (brew)=>({
...brew, ...brew,
save : saveFunc, save : saveFunc,
remove : removeFunc, remove : removeFunc,
toObject : function() { markModified : markModifiedFunc,
toObject : function() {
delete this.save; delete this.save;
delete this.toObject; delete this.toObject;
delete this.remove; delete this.remove;
delete this.markModified;
return this; return this;
} }
}); });
@@ -71,7 +75,8 @@ describe('Tests for api', ()=>{
lastViewed : new Date(), lastViewed : new Date(),
version : 1, version : 1,
pageCount : 1, pageCount : 1,
textBin : '' textBin : '',
views : 0
}; };
googleBrew = { googleBrew = {
...hbBrew, ...hbBrew,
@@ -261,7 +266,8 @@ If you believe you should have access to this brew, ask the file owner to invite
gDrive : false, gDrive : false,
style : undefined, style : undefined,
trashed : false, trashed : false,
updatedAt : undefined updatedAt : undefined,
views : 0
}); });
expect(next).toHaveBeenCalled(); expect(next).toHaveBeenCalled();
expect(api.getId).toHaveBeenCalledWith(req); expect(api.getId).toHaveBeenCalledWith(req);
@@ -452,7 +458,8 @@ brew`);
thumbnail : '', thumbnail : '',
title : 'asdf', title : 'asdf',
trashed : false, trashed : false,
updatedAt : undefined updatedAt : undefined,
views : 0
}); });
}); });
@@ -510,7 +517,8 @@ brew`);
thumbnail : '', thumbnail : '',
title : 'asdf', title : 'asdf',
trashed : false, trashed : false,
updatedAt : undefined updatedAt : undefined,
views : 0
}); });
}); });
@@ -623,6 +631,7 @@ brew`);
await api.deleteBrew(req, res); await api.deleteBrew(req, res);
expect(api.getBrew).toHaveBeenCalled(); expect(api.getBrew).toHaveBeenCalled();
expect(markModifiedFunc).toHaveBeenCalled();
expect(model.findOne).toHaveBeenCalled(); expect(model.findOne).toHaveBeenCalled();
expect(removeFunc).not.toHaveBeenCalled(); expect(removeFunc).not.toHaveBeenCalled();
expect(saveFunc).toHaveBeenCalled(); expect(saveFunc).toHaveBeenCalled();
@@ -712,6 +721,7 @@ brew`);
await api.deleteBrew(req, res); await api.deleteBrew(req, res);
expect(api.getBrew).toHaveBeenCalled(); expect(api.getBrew).toHaveBeenCalled();
expect(markModifiedFunc).toHaveBeenCalled();
expect(model.findOne).toHaveBeenCalled(); expect(model.findOne).toHaveBeenCalled();
expect(removeFunc).not.toHaveBeenCalled(); expect(removeFunc).not.toHaveBeenCalled();
expect(api.deleteGoogleBrew).toHaveBeenCalled(); expect(api.deleteGoogleBrew).toHaveBeenCalled();

View File

@@ -22,7 +22,7 @@
vertical-align : middle; vertical-align : middle;
text-align : center; text-align : center;
i{ i{
display : block; display : block !important;
margin : 10px 0px; margin : 10px 0px;
font-size : 6px; font-size : 6px;
color : #666; color : #666;