mirror of
https://github.com/discourse/discourse.git
synced 2024-11-27 16:53:43 +08:00
946f25098f
This paves the way to allowing themes to specify uploads and so on.
113 lines
3.4 KiB
Ruby
113 lines
3.4 KiB
Ruby
require 'rails_helper'
|
|
|
|
describe RemoteTheme do
|
|
context '#import_remote' do
|
|
def setup_git_repo(files)
|
|
dir = Dir.tmpdir
|
|
repo_dir = "#{dir}/#{SecureRandom.hex}"
|
|
`mkdir #{repo_dir}`
|
|
`cd #{repo_dir} && git init . `
|
|
`cd #{repo_dir} && git config user.email 'someone@cool.com'`
|
|
`cd #{repo_dir} && git config user.name 'The Cool One'`
|
|
`cd #{repo_dir} && mkdir desktop mobile common`
|
|
files.each do |name, data|
|
|
File.write("#{repo_dir}/#{name}", data)
|
|
`cd #{repo_dir} && git add #{name}`
|
|
end
|
|
`cd #{repo_dir} && git commit -am 'first commit'`
|
|
repo_dir
|
|
end
|
|
|
|
def about_json(options = {})
|
|
options[:love] ||= "FAFAFA"
|
|
|
|
<<JSON
|
|
{
|
|
"name": "awesome theme",
|
|
"about_url": "https://www.site.com/about",
|
|
"license_url": "https://www.site.com/license",
|
|
"color_schemes": {
|
|
"Amazing": {
|
|
"love": "#{options[:love]}"
|
|
}
|
|
}
|
|
}
|
|
JSON
|
|
end
|
|
|
|
let :initial_repo do
|
|
setup_git_repo(
|
|
"about.json" => about_json,
|
|
"desktop/desktop.scss" => "body {color: red;}",
|
|
"common/header.html" => "I AM HEADER",
|
|
"common/random.html" => "I AM SILLY",
|
|
"common/embedded.scss" => "EMBED",
|
|
)
|
|
end
|
|
|
|
after do
|
|
`rm -fr #{initial_repo}`
|
|
end
|
|
|
|
it 'can correctly import a remote theme' do
|
|
|
|
time = Time.new('2000')
|
|
freeze_time time
|
|
|
|
@theme = RemoteTheme.import_theme(initial_repo)
|
|
remote = @theme.remote_theme
|
|
|
|
expect(@theme.name).to eq('awesome theme')
|
|
expect(remote.remote_url).to eq(initial_repo)
|
|
expect(remote.remote_version).to eq(`cd #{initial_repo} && git rev-parse HEAD`.strip)
|
|
expect(remote.local_version).to eq(`cd #{initial_repo} && git rev-parse HEAD`.strip)
|
|
|
|
expect(remote.about_url).to eq("https://www.site.com/about")
|
|
expect(remote.license_url).to eq("https://www.site.com/license")
|
|
|
|
expect(@theme.theme_fields.length).to eq(3)
|
|
|
|
mapped = Hash[*@theme.theme_fields.map{|f| ["#{f.target_id}-#{f.name}", f.value]}.flatten]
|
|
|
|
expect(mapped["0-header"]).to eq("I AM HEADER")
|
|
expect(mapped["1-scss"]).to eq("body {color: red;}")
|
|
expect(mapped["0-embedded_scss"]).to eq("EMBED")
|
|
|
|
expect(remote.remote_updated_at).to eq(time)
|
|
|
|
scheme = ColorScheme.find_by(theme_id: @theme.id)
|
|
expect(scheme.name).to eq("Amazing")
|
|
expect(scheme.colors.find_by(name: 'love').hex).to eq('fafafa')
|
|
|
|
File.write("#{initial_repo}/common/header.html", "I AM UPDATED")
|
|
File.write("#{initial_repo}/about.json", about_json(love: "EAEAEA"))
|
|
|
|
`cd #{initial_repo} && git commit -am "update"`
|
|
|
|
|
|
time = Time.new('2001')
|
|
freeze_time time
|
|
|
|
remote.update_remote_version
|
|
expect(remote.commits_behind).to eq(1)
|
|
expect(remote.remote_version).to eq(`cd #{initial_repo} && git rev-parse HEAD`.strip)
|
|
|
|
|
|
remote.update_from_remote
|
|
@theme.save
|
|
@theme.reload
|
|
|
|
scheme = ColorScheme.find_by(theme_id: @theme.id)
|
|
expect(scheme.name).to eq("Amazing")
|
|
expect(scheme.colors.find_by(name: 'love').hex).to eq('eaeaea')
|
|
|
|
mapped = Hash[*@theme.theme_fields.map{|f| ["#{f.target_id}-#{f.name}", f.value]}.flatten]
|
|
|
|
expect(mapped["0-header"]).to eq("I AM UPDATED")
|
|
expect(mapped["1-scss"]).to eq("body {color: red;}")
|
|
expect(remote.remote_updated_at).to eq(time)
|
|
|
|
end
|
|
end
|
|
end
|